事務的幾種傳播特性
- PROPAGATION_REQUIRED: 如果存在一個事務喜喂,則支持當前事務锌妻。如果沒有事務則開啟
- PROPAGATION_SUPPORTS: 如果存在一個事務遇八,則支持當前事務。如果沒有事務甸鸟,則非事務的執(zhí)行
- PROPAGATION_MANDATORY: 如果存在一個事務撇贺,則支持當前事務。如果沒有一個活動的事務司志,則拋出異常甜紫。
- PROPAGATION_REQUIRES_NEW: 總是開啟一個新的事務。如果一個事務已經(jīng)存在骂远,則將這個存在的事務掛起囚霸。
- PROPAGATION_NOT_SUPPORTED: 總是非事務地執(zhí)行,并掛起任何存在的事務激才。
- PROPAGATION_NEVER: 總是非事務地執(zhí)行拓型,如果存在一個活動事務,則拋出異常
- PROPAGATION_NESTED:如果一個活動的事務存在瘸恼,則運行在一個嵌套的事務中. 如果沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執(zhí)行
Spring事務的隔離級別 - ISOLATION_DEFAULT: 這是一個PlatfromTransactionManager默認的隔離級別劣挫,使用數(shù)據(jù)庫默認的事務隔離級別.
另外四個與JDBC的隔離級別相對應 - ISOLATION_READ_UNCOMMITTED: 這是事務最低的隔離級別,它充許令外一個事務可以看到這個事務未提交的數(shù)據(jù)东帅。 這種隔離級別會產(chǎn)生臟讀压固,不可重復讀和幻像讀。
- ISOLATION_READ_COMMITTED: 保證一個事務修改的數(shù)據(jù)提交后才能被另外一個事務讀取靠闭。另外一個事務不能讀取該事務未提交的數(shù)據(jù)
- ISOLATION_REPEATABLE_READ: 這種事務隔離級別可以防止臟讀邓夕,不可重復讀。但是可能出現(xiàn)幻像讀阎毅。 它除了保證一個事務不能讀取另一個事務未提交的數(shù)據(jù)外焚刚,還保證了避免下面的情況產(chǎn)生(不可重復讀)。
- ISOLATION_SERIALIZABLE 這是花費最高代價但是最可靠的事務隔離級別扇调。事務被處理為順序執(zhí)行矿咕。 除了防止臟讀,不可重復讀外狼钮,還避免了幻像讀碳柱。
**其中的一些概念的說明:
**
** 臟讀:
**指當一個事務正在訪問數(shù)據(jù),并且對數(shù)據(jù)進行了修改熬芜,而這種修改還沒有提交到數(shù)據(jù)庫中莲镣,這時,另外一個事務也訪問這個數(shù)據(jù)涎拉,然后使用了這個數(shù)據(jù)瑞侮。因為這個數(shù)據(jù)是還沒有提交的數(shù)據(jù)的圆, 那么另外一 個事務讀到的這個數(shù)據(jù)是臟數(shù)據(jù),依據(jù)臟數(shù)據(jù)所做的操作可能是不正確的半火。
**不可重復讀:
指在一個事務內越妈,多次讀同一數(shù)據(jù)。在這個事務還沒有結束時钮糖,另外一個事務也訪問該同一數(shù)據(jù)梅掠。 那么,在第一個事務中的兩次讀數(shù)據(jù)之間店归,由于第二個事務的修改阎抒,那么第一個事務兩次讀到的數(shù)據(jù)可能是不一樣的。這樣就發(fā)生了在一個事務內兩次讀到的數(shù)據(jù)是不一樣的消痛,因此稱為是不可重復讀挠蛉。
** 幻覺讀:
指當事務不是獨立執(zhí)行時發(fā)生的一種現(xiàn)象,例如第一個事務對一個表中的數(shù)據(jù)進行了修改肄满,這種修改涉及 到表中的全部數(shù)據(jù)行谴古。同時,第二個事務也修改這個表中的數(shù)據(jù)稠歉,這種修改是向表中插入一行新數(shù)據(jù)掰担。那么,以后就會發(fā)生操作第一個事務的用戶發(fā)現(xiàn)表中還有沒有修改的數(shù)據(jù)行怒炸,就好象發(fā)生了幻覺一樣