前言:最近在看spring的事物
一、Spring事務(wù)隔離級別

image.png
- ISOLATION_DEFAULT: 默認(rèn)的隔離級別,使用數(shù)據(jù)庫默認(rèn)的事務(wù)隔離級別。
- ISOLATION_READ_UNCOMMITTED: 未提交讀,允許一個事務(wù)讀取另外一個事務(wù)未提交的數(shù)據(jù),或造成臟讀、幻讀、不可重復(fù)讀。
- ISOLATION_COMMITTED: 提交讀,保證一個事務(wù)修改的數(shù)據(jù)提交后才能被另外一個事務(wù)讀取。另外一個事務(wù)不能讀取該事務(wù)未提交的數(shù)據(jù)。防止臟讀。
- ISOLATION_RETETABLE_READ: 可重復(fù)讀,可以防止臟讀、不可重復(fù)讀,但是還會造成幻讀。(在可重復(fù)讀(REPEATABLE READS)隔離級別中,基于鎖機(jī)制并發(fā)控制的DBMS需要對選定對象的讀鎖(read locks)和寫鎖(write locks)一直保持到事務(wù)結(jié)束,但不要求“范圍鎖(range-locks)”,因此可能會發(fā)生“幻影讀(phantom reads)”
在該事務(wù)級別下,保證同一個事務(wù)從開始到結(jié)束獲取到的數(shù)據(jù)一致。這是Mysql的默認(rèn)事務(wù)級別。) - ISOLATION_SERIALIZABLE: 串行事務(wù),事務(wù)串行執(zhí)行,防止臟讀、不可重復(fù)讀、幻讀。
- 事物的隔離級別造成的問題
| 問題 | 描述 |
|---|---|
| 臟讀 | 一個事物讀到另一個事物未提交的更新數(shù)據(jù)。所謂臟讀,就是指事物A讀到了事物B還沒有提交的數(shù)據(jù),比如銀行取錢,事物A開啟事物,此時切換到事物B,事物B開啟事物 -> 取走100元,事物A讀取的肯定是數(shù)據(jù)庫里面的原始數(shù)據(jù),因為事物B取走了100塊,并沒有提交,數(shù)據(jù)庫里面的賬戶余額肯定還是原始余額,這就是臟讀 |
| 幻讀 | 是指當(dāng)事物不是獨(dú)立執(zhí)行時發(fā)生的一種現(xiàn)象。例如第一個事物對一個表中的數(shù)據(jù)進(jìn)行了修改,這種修改涉及到表中的全部數(shù)據(jù)行。同時,第二個事物也修改這個表中的數(shù)據(jù),這種修改是向表中插入一行新數(shù)據(jù)。那么,以后就會發(fā)生操作第一個事物的用戶發(fā)現(xiàn)表中還有沒有修改的數(shù)據(jù)行,就好像發(fā)生幻覺一樣 |
| 不可重復(fù)讀 | 在一個事物里面的操作中發(fā)現(xiàn)了未被操作的數(shù)據(jù)。比方說在同一個事物中先后執(zhí)行兩條一模一樣的select語句,期間在此次事物中沒有執(zhí)行過任何DDL語句,但先后得到的結(jié)果不一致,這就是不可重復(fù)讀 |
| 隔離級別 | 臟讀可能性 | 不可重復(fù)讀可能性 | 幻讀可能性 | 加鎖讀 |
|---|---|---|---|---|
| READ UNCOMMITTED | 是 | 是 | 是 | 否 |
| READ COMMITTED | 否 | 是 | 是 | 否 |
| REPEATABLE READ | 否 | 否 | 是 | 否 |
| SERIALIZABLE | 否 | 否 | 否 | 是 |
二、Spring事務(wù)傳播機(jī)制

image.png
(需要事務(wù)加入)
1. REQUIRED: 如果當(dāng)前有事務(wù)就加入事務(wù),如果沒有事務(wù)則創(chuàng)建一個新的。
2. REQUIRES_NEW: 創(chuàng)建一個新的事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。(嵌套事務(wù))
3. NESTED: 如果當(dāng)前存在事務(wù),則創(chuàng)建一個事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來運(yùn)行。如果沒有事務(wù),相當(dāng)于REQUIRED。(支持,如果有就支持,如果沒有就算了)
4.SUPPORTS: 如果當(dāng)前存在事務(wù),則加入該事務(wù)。如果當(dāng)前沒有事務(wù),則以非事務(wù)的方式進(jìn)行。(不支持)
5. NOT_SUPPORTS: 以非事務(wù)方式運(yùn)行。如果當(dāng)前有事務(wù),則把當(dāng)前事務(wù)掛起。-
(強(qiáng)制性的,一定要有,沒有就拋異常)
- MANDATORY:如果當(dāng)前存在事務(wù),則運(yùn)行在當(dāng)前事務(wù)中。如果沒有事務(wù),則拋出異常。
(從不,比NOT_SUPPORT更硬,直接異常)
7. NEVER: 以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常,即父級方法必須無事務(wù)。