簡(jiǎn)單介紹Spring事務(wù)管理
Spring事務(wù)管理有事務(wù)傳播,事務(wù)隔離,事務(wù)并發(fā)處理等。
事務(wù)傳播
1、required:方法在一個(gè)事務(wù)中執(zhí)行,如果調(diào)用的方法在一個(gè)事務(wù)中,則使用該事務(wù),否則將創(chuàng)建一個(gè)新的事務(wù)。(必須有,有就用,沒有就建)
2、mandatory:如果運(yùn)行于事務(wù)中的客戶調(diào)用了該方法,方法在客戶的事務(wù)中執(zhí)行。如果客戶沒有關(guān)聯(lián)到事務(wù)中,容器就會(huì)拋出TransactionRequiredException.(必須有,有就用,沒有報(bào)錯(cuò))
3、requiresnew:方法將在一個(gè)新的事務(wù)中執(zhí)行,如果調(diào)用的方法已經(jīng)在一個(gè)事務(wù)中,則暫停舊的事務(wù)。在調(diào)用結(jié)束后恢復(fù)舊的事務(wù)。(必須有,有沒有都要建)
4、supports:如果方法在一個(gè)事務(wù)中被調(diào)用,則使用該事務(wù),否則不使用事務(wù)。(有沒有都中,有就用,沒有不用)
5、not_supported:如果方法在一個(gè)事務(wù)中被調(diào)用,容器會(huì)在調(diào)用之前終止該事務(wù)。在調(diào)用結(jié)束后,容器會(huì)恢復(fù)客戶事務(wù)。如果客戶沒有關(guān)聯(lián)到一個(gè)事務(wù)中,容器不會(huì)入運(yùn)行在該方法啟動(dòng)一個(gè)新的事務(wù)。用notsupported屬性標(biāo)識(shí)不需要事務(wù)的方法。因?yàn)槭聞?wù)會(huì)帶來更高的性能支出,所以這個(gè)屬性可以提高性能。(不需要,有就掛起事務(wù),沒有直接運(yùn)行)
6、Never:如果在一個(gè)事務(wù)中調(diào)用該方法,容器會(huì)拋出RemoteException。如果客戶沒有關(guān)聯(lián)到一個(gè)事務(wù)中,容器不會(huì)在運(yùn)行入該方法前啟動(dòng)一個(gè)新的事務(wù)。(必須沒有,有就報(bào)錯(cuò),沒有就直接運(yùn)行)
事務(wù)隔離
為什么要使用事物隔離,是因?yàn)槭挛锊l(fā)引起的一些錯(cuò)誤現(xiàn)象
并發(fā)問題:
臟讀:一個(gè)事務(wù)讀取了未提交的事務(wù)
不可重復(fù)讀:同一個(gè)事務(wù)中多次讀取同一個(gè)數(shù)據(jù)返回的結(jié)果不同
幻讀:一個(gè)事務(wù)讀取到了另一個(gè)事務(wù)已提交的insert數(shù)據(jù)。
事務(wù)并發(fā)處理:
共享鎖:共享鎖用于讀取數(shù)據(jù)操作,它允許其他事務(wù)同時(shí)讀取某鎖定的資源,但不允許其他事務(wù)更新它。
排他鎖:排它鎖用于修改數(shù)據(jù)的場(chǎng)合。它鎖定的資源,其他事務(wù)不能讀取也不能修改。
更新鎖:更新鎖在更新操作的初始化階段用來鎖定可能要被修改的資源,從而避免使用共享鎖造成的死鎖現(xiàn)象。
事務(wù)隔離級(jí)別:
ReadUncommitted:讀未提交數(shù)據(jù),該選項(xiàng)指示數(shù)據(jù)庫讀取數(shù)據(jù)時(shí)不使用任何鎖。在這種情況下,事務(wù)可以讀取到未提交的數(shù)據(jù),會(huì)出現(xiàn)臟讀,不可重復(fù)讀和幻讀現(xiàn)象。
ReadCommited:
該選項(xiàng)只會(huì)返回"讀取時(shí)間點(diǎn)"之前已提交的數(shù)據(jù)。因此可以避免臟讀,但是會(huì)出現(xiàn)不可重復(fù)讀,另外還會(huì)出現(xiàn)幻讀現(xiàn)象。
RepeatableRead:該選項(xiàng)能夠保證可重復(fù)讀,可以避免臟讀和不可重復(fù)讀。
Serializable:該選項(xiàng)能夠避免臟讀、不可重復(fù)讀和幻讀現(xiàn)象,是最嚴(yán)格的隔離級(jí)別。
【編輯推薦】