事務:
是數據庫操作的最小工作單元,是作爲單個邏輯工作單元執行的一系列操作;這些操作作爲一個整體一起向系統提交,要麼都執行、要麼都不執行;
事務是一組不可再分割的操作集合(工作邏輯單元)
事務的案例
MyISAM和InnoDB的區別
Mysql數據庫中: MyISAM不支持事務,InnoDB支持事務
- MySQL默認採用的是MyISAM。
- MyISAM不支持事務,而InnoDB支持。InnoDB的AUTOCOMMIT默認是打開的,即每條SQL語句會默認被封裝成一個事務,自動提交,這樣會影響速度,所以最好是把多條SQL語句顯示放在begin和commit之間,組成一個事務去提交。
- InnoDB支持外鍵,MyISAM不支持。
- InnoDB的主鍵範圍更大,最大是MyISAM的2倍。
- MyISAM支持GIS數據,InnoDB不支持。即MyISAM支持以下空間數據對象:Point,Line,Polygon,Surface等。
如果一個數據庫聲稱支持事務的操作,那麼該數據庫必須要具備以下四個特性:
- 原子性(Atomicity)
原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,因此事務的操作如果成功就必須要完全應用到數據庫,如果操作失敗則不能對數據庫有任何影響。 - 一致性(Consistency)
一致性是指事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之後都必須處於一致性狀態。
拿轉賬來說,假設用戶A和用戶B兩者的錢加起來一共是5000,那麼不管A和B之間如何轉賬,轉幾次賬,事務結束後兩個用戶的錢相加起來應該還得是5000,這就是事務的一致性。 - 隔離性(Isolation)
隔離性是當多個用戶併發訪問數據庫時,比如操作同一張表時,數據庫爲每一個用戶開啓的事務,不能被其他事務的操作所幹擾,多個併發事務之間要相互隔離。
即要達到這麼一種效果:對於任意兩個併發的事務T1和T2,在事務T1看來,T2要麼在T1開始之前就已經結束,要麼在T1結束之後纔開始,這樣每個事務都感覺不到有其他事務在併發地執行。
關於事務的隔離性數據庫提供了多種隔離級別。這個可以查詢百度 - 持久性(Durability)
持久性是指一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的,即便是在數據庫系統遇到故障的情況下也不會丟失提交事務的操作。
例如我們在使用JDBC操作數據庫時,在提交事務方法後,提示用戶事務操作完成,當我們程序執行完成直到看到提示後,就可以認定事務以及正確提交,即使這時候數據庫出現了問題,也必須要將我們的事務完全執行完成,否則就會造成我們看到提示事務處理完畢,但是數據庫因爲故障而沒有執行事務的重大錯誤
簡單應用
分析:事務就是要不全部成功,要不全部不成功…
比如我們刪除2條數據
如果沒有依賴,在pom中添加spring-boot依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
在Service層方法上面加上
@Transactional(rollbackFor= {IllegalArgumentException.class})
@Override
@Transactional(rollbackFor= {IllegalArgumentException.class})
public void delAll() {
int a=tbSchoolDao.deleteById(191);
int b=tbSchoolDao.deleteById(5000);
if(a<=0||b<=0) {
throw new IllegalArgumentException("數據將回滾");
}
}
Controller層
@Log("事務")
@AuthIgnore
@PostMapping("affair")
public R affair() {
try {
tbSchoolService.delAll();
} catch (Exception e) {
// TODO: handle exception
}
return R.ok();
}
結果:如果只刪除id爲191或者id爲5000的數據,2個數據將會不變,
如果刪除2個數據全部刪除,這就是符合事務要麼成功,要麼失敗