1.傳播行為
定義了關(guān)于客戶端和被調(diào)用方法的事務(wù)邊界。傳播規(guī)則就是在說(shuō)明新的事務(wù)是否要被啟動(dòng)或是掛起,或者方法是否要在事務(wù)環(huán)境中運(yùn)行。
spring定義了7種不同的傳播行為。
1)PROPAGATION_MANDATORY
?? 表明方法必須要在事務(wù)中運(yùn)行。如果事務(wù)不存在,拋出異常
2)PROPAGATION_NESTED
?? 表示如果當(dāng)前已經(jīng)存在一個(gè)事務(wù),則該方法應(yīng)當(dāng)運(yùn)行在一個(gè)嵌套的事務(wù)中。被嵌套的事務(wù)可以從當(dāng)前事務(wù)中單獨(dú)地提交或回滾。如果當(dāng)前事務(wù)不存在,就相當(dāng)于PROPAGATION_REQUIRED
3)PROPAGATION_NEVER
? 表示當(dāng)前的方法不應(yīng)該運(yùn)行在一個(gè)事務(wù)上下文中。如果當(dāng)前存在一個(gè)事務(wù),則會(huì)拋出一個(gè)異常。
4)PROPAGATION_NOT_SUPPORTED
表示該方法不應(yīng)該在事務(wù)中運(yùn)行。如果一個(gè)現(xiàn)有的事務(wù)正在運(yùn)行中。它將在該方法的運(yùn)行期間被掛起
5)PROPAGATION_REQUIRED
表示當(dāng)前方法必須運(yùn)行在一個(gè)事務(wù)中。如果一個(gè)現(xiàn)有的事務(wù)正在運(yùn)行中,該方法將運(yùn)行在這個(gè)事務(wù)中。否則的話,就要開(kāi)始一個(gè)新的事務(wù)。
6)PROPAGATION_REQUIRES_NEW
表示當(dāng)前方法必須運(yùn)行在它自己的事務(wù)中。如果一個(gè)現(xiàn)有事務(wù)在運(yùn)行的話,將在這個(gè)方法運(yùn)行期間被掛起。
7)PROPAGATION_SUPPORTS
表示當(dāng)前方法不需要事務(wù)處理環(huán)境,但如果有一個(gè)事務(wù)已經(jīng)在運(yùn)行的話,這個(gè)方法也可以在這個(gè)事務(wù)中運(yùn)行
2.隔離級(jí)別
多個(gè)事務(wù)并發(fā)運(yùn)行的關(guān)系。因?yàn)椴l(fā)會(huì)導(dǎo)致以下問(wèn)題
.臟讀(Dirty read) 一個(gè)事務(wù)讀取了被另一個(gè)事務(wù)改寫(xiě)但還沒(méi)提交的數(shù)據(jù)。
.不可重復(fù)讀(Nonrepeatable read) 一個(gè)事務(wù)執(zhí)行相同的查詢兩次或兩次以上,但每次查詢結(jié)果都不同時(shí)。這由于另一個(gè)并發(fā)事務(wù)在兩次查詢之間更新了數(shù)據(jù)
.幻讀(Phantom read)
當(dāng)一個(gè)事務(wù)讀取幾行記錄后,另一個(gè)并發(fā)事務(wù)插入一些記錄,就發(fā)生了幻讀
spring定義了以下5種隔離關(guān)系
1)ISOLATION_DEFAULT
使用后端數(shù)據(jù)庫(kù)默認(rèn)得隔離級(jí)別
2)ISOLATION_READ_UNCOMMITTED
允許你讀取還未提交的改變了的數(shù)據(jù)。可能導(dǎo)致臟讀,不可重復(fù)讀,幻讀
3)ISOLATION_READ_COMMITTTED
運(yùn)行在并發(fā)事務(wù)已經(jīng)提價(jià)后讀取。可防止臟讀,但不可重復(fù)讀,幻讀都有可能發(fā)生
4)ISOLATION_REPEATABLE_READ
對(duì)相同字段的多次讀取結(jié)果是一致的,除非數(shù)據(jù)被事務(wù)本身。可防止臟讀,不可重復(fù)讀,但幻讀仍可能發(fā)生。
5)ISOLATION_SERIALIZABLE
完全服從ACID的隔離級(jí)別,確保不發(fā)生臟讀,不可重復(fù)讀,幻讀。它的典型做法就是完全鎖定在事務(wù)中涉及的數(shù)據(jù)表。因此它是最慢地。
3.只讀提示
通過(guò)只讀屬性,數(shù)據(jù)庫(kù)可以對(duì)事務(wù)進(jìn)行優(yōu)化。
4.事務(wù)超時(shí)時(shí)間
設(shè)置了的話,事務(wù)在超過(guò)這個(gè)時(shí)間后就自動(dòng)回滾。避免占用資源過(guò)久。