快速了解spring事務七種傳播方式、事務的4種隔離級別、臟讀、重複讀、幻讀;
1、事務執行過程中會出現幾種情況
(1)臟讀
出現原因:修改數據的同時可以讀取數據;
說明:當事務B對data進行了修改但是未提交事務,此時事務A對data進行讀取,並使用事務B修改的數據做業務處理,;
案例:
(2)不可重複讀
出現原因:讀取數據的同時可以進行修改;
說明:事務A,事務B同時對dataA進行訪問,事務A對data進行讀取,事務B對data進行修改,當事務A第一次對data進行讀取完後事務B提交,此時當事務A第二次讀取該數據時的數據就與第一次讀取的數據不同,這種情況成為不可重複讀;
案例:
(3)幻讀
出現原因:讀取和修改的時候可以insert數據;
說明:data 表有一條數據,事務A對data進行讀取, 事務B對data進行數據新增 ,此時事務A讀取只有一條數據,而最後實際data是有兩條數據,就好象發生了幻覺一樣情況成為幻讀;
案例:
2、事務的四種級別
(1)READ_UNCOMMITTED(讀未提交):,可讀取未提交事務的操作數據,這種情況會出現臟讀;
(2)READ_COMMITTED(讀提交):一個事務等另一個事務提交之後才可進行讀取,解決了臟讀問題,但會出現重複讀問題;
(3)REPEATABLE_READ(重複讀):讀取事務開啟的時候不能對數據進行修改,可能出現幻讀問題;
(4)SERIALIZABLE (序列化):是最高的事務隔離級別,在該級別下,事務串列化順序執行,可以避免臟讀、不可重複讀與幻讀。但是這種事務隔離級別效率低下,比較耗資料庫性能,一般不使用;
3、spring事務的七中傳播方式
spring事務的七中傳播方式主要是針對於方法中間傳遞時的事務機制,
例如:以方法B為當前主體 ,方法A調用了方法B ,作為方法B你看方法A
(1)PROPAGATION_REQUIRED(默認):如果A有事務則B加入A事務,如果A沒有事務則新B建一個事務;
(2)PROPAGATION_NEW:B總是開啟一個新的事務,如果A有事務則將A事務掛起先執行B事務;
(3)PROPAGATION_NESTED:RUGU :如果A沒事務則新建一個事務,如果A有事務則把B的事務當成A的一個子事務(A事務rolback,commit影響B,B事務rolback,commit不影響A);
(4)PROPAGATION_SUPPORTS:如果A沒事務,那就按普通方法執行,如果有A事務則用A的事務(B本身不具備事務);
(5))PROPAGATION_NOT_SUPPORTED:B總是非事務地執行,如果A有事務則把A事務掛起,自己還是以普通方法執行(B本身不具備事務);
(6)PROPAGATION_NEVER:如果A沒事務,那就按普通方法執行,如果A有事務則拋出異常((B本身不具備事務);
(7)PROPAGATION_MANDATORY:如果A沒事務就拋異常,如果A有事務則使用A的事務(B本身不具備事務);
推薦資料
事務ACID特性:事務的ACID特性 - 知乎專欄
書籍<架構探險>
推薦閱讀:
※memcached 和 mysql 結合使用的兩種實現選擇?
※MySQL中inner join 和 cross join 的區別?
※如何才能招到優秀的 MySQL DBA?
※memcached plugin(handlersocket),Memcached的一點看法