spring 事务-使用@Transactional 注解(事务隔离级别)
先看下@Transactional可以配制那些參數(shù)及以其所代表的意義。
?
?
| isolation | 枚舉org.springframework.transaction.annotation.Isolation的值 | 事務(wù)隔離級(jí)別 |
| noRollbackFor | Class<? extends Throwable>[] | 一組異常類,遇到時(shí)不回滾。默認(rèn)為{} |
| noRollbackForClassName | Stirng[] | 一組異常類名,遇到時(shí)不回滾,默認(rèn)為{} |
| propagation | 枚舉org.springframework.transaction.annotation.Propagation的值 | 事務(wù)傳播行為 |
| readOnly | boolean | 事務(wù)讀寫性 |
| rollbackFor | Class<? extends Throwable>[] | 一組異常類,遇到時(shí)回滾 |
| rollbackForClassName | Stirng[] | 一組異常類名,遇到時(shí)回滾 |
| timeout | ? | 超時(shí)時(shí)間,以秒為單位 |
| value | String | 可選的限定描述符,指定使用的事務(wù)管理器 |
?
isolation事務(wù)隔離級(jí)別,使用時(shí)一般如下。
?
isolation的參數(shù)有以下五種:
?
1_1、Isolation.DEFAULT:為數(shù)據(jù)源的默認(rèn)隔離級(jí)別
1_2、isolation=Isolation.READ_UNCOMMITTED:未授權(quán)讀取級(jí)別
以操作同一行數(shù)據(jù)為前提,讀事務(wù)允許其他讀事務(wù)和寫事務(wù),未提交的寫事務(wù)禁止其他寫事務(wù)(但允許其他讀事務(wù))。此隔離級(jí)別可以防止更新丟失,但不能防止臟讀、不可重復(fù)讀、幻讀。此隔離級(jí)別可以通過“排他寫鎖”實(shí)現(xiàn)。
1_3、iIsolation.READ_COMMITTED:授權(quán)讀取級(jí)別
?
以操作同一行數(shù)據(jù)為前提,讀事務(wù)允許其他讀事務(wù)和寫事務(wù),未提交的寫事務(wù)禁止其他讀事務(wù)和寫事務(wù)。此隔離級(jí)別可以防止更新丟失、臟讀,但不能防止不可重復(fù)讀、幻讀。此隔離級(jí)別可以通過“瞬間共享讀鎖”和“排他寫鎖”實(shí)現(xiàn)。
1_4、iIsolation.REPEATABLE_READ:可重復(fù)讀取級(jí)別
?
以操作同一行數(shù)據(jù)為前提,讀事務(wù)禁止其他寫事務(wù)(但允許其他讀事務(wù)),未提交的寫事務(wù)禁止其他讀事務(wù)和寫事務(wù)。此隔離級(jí)別可以防止更新丟失、臟讀、不可重復(fù)讀,但不能防止幻讀。此隔離級(jí)別可以通過“共享讀鎖”和“排他寫鎖”實(shí)現(xiàn)。
1_5、iIsolation.SERIALIZABLE:序列化級(jí)別
提供嚴(yán)格的事務(wù)隔離。它要求事務(wù)序列化執(zhí)行,事務(wù)只能一個(gè)接著一個(gè)地執(zhí)行,不能并發(fā)執(zhí)行。此隔離級(jí)別可以防止更新丟失、臟讀、不可重復(fù)讀、幻讀。如果僅僅通過“行級(jí)鎖”是無法實(shí)現(xiàn)事務(wù)序列化的,必須通過其他機(jī)制保證新插入的數(shù)據(jù)不會(huì)被剛執(zhí)行查詢操作的事務(wù)訪問到。
隔離級(jí)別越高,越能保證數(shù)據(jù)的完整性和一致性,但是對(duì)并發(fā)性能的影響也越大。對(duì)于多數(shù)應(yīng)用程序,可以優(yōu)先考慮把數(shù)據(jù)庫(kù)系統(tǒng)的隔離級(jí)別設(shè)為Read Committed。它能夠避免更新丟失、臟讀,而且具有較好的并發(fā)性能。盡管它會(huì)導(dǎo)致不可重復(fù)讀、幻讀這些并發(fā)問題,在可能出現(xiàn)這類問題的個(gè)別場(chǎng)合,可以由應(yīng)用程序采用悲觀鎖或樂觀鎖來控制。
有關(guān)事務(wù)的關(guān)鍵字說明如下,說明如下:
?
原子性(Atomicity):
事務(wù)是數(shù)據(jù)庫(kù)的邏輯工作單位,它對(duì)數(shù)據(jù)庫(kù)的修改要么全部執(zhí)行,要么全部不執(zhí)行。
一致性(Consistemcy):
事務(wù)前后,數(shù)據(jù)庫(kù)的狀態(tài)都滿足所有的完整性約束。
隔離性(Isolation):
并發(fā)執(zhí)行的事務(wù)是隔離的,一個(gè)不影響一個(gè)。如果有兩個(gè)事務(wù),運(yùn)行在相同的時(shí)間內(nèi),執(zhí)行相同的功能,事務(wù)的隔離性將確保每一事務(wù)在系統(tǒng)中認(rèn)為只有該事務(wù)在使用系統(tǒng)。這種屬性有時(shí)稱為串行化,為了防止事務(wù)操作間的混淆,必須串行化或序列化請(qǐng)求,使得在同一時(shí)間僅有一個(gè)請(qǐng)求用于同一數(shù)據(jù)。通過設(shè)置數(shù)據(jù)庫(kù)的隔離級(jí)別,可以達(dá)到不同的隔離效果。
持久性(Durability):
在事務(wù)完成以后,該事務(wù)所對(duì)數(shù)據(jù)庫(kù)所作的更改便持久的保存在數(shù)據(jù)庫(kù)之中,并不會(huì)被回滾。
更新丟失:
兩個(gè)事務(wù)都同時(shí)更新一行數(shù)據(jù),但是第二個(gè)事務(wù)卻中途失敗退出,導(dǎo)致對(duì)數(shù)據(jù)的兩個(gè)修改都失效了。這是因?yàn)橄到y(tǒng)沒有執(zhí)行任何的鎖操作,因此并發(fā)事務(wù)并沒有被隔離開來。
臟讀:
臟讀又稱無效數(shù)據(jù)讀出。一個(gè)事務(wù)讀取另外一個(gè)事務(wù)還沒有提交的數(shù)據(jù)叫臟讀。
例如:事務(wù)T1修改了一行數(shù)據(jù),但是還沒有提交,這時(shí)候事務(wù)T2讀取了被事務(wù)T1修改后的數(shù)據(jù),之后事務(wù)T1因?yàn)槟撤N原因Rollback了,那么事務(wù)T2讀取的數(shù)據(jù)就是臟的。
不可重復(fù)讀:
不可重復(fù)讀是指在同一個(gè)事務(wù)內(nèi),兩個(gè)相同的查詢返回了不同的結(jié)果。
例如:事務(wù)T1讀取某一數(shù)據(jù),事務(wù)T2讀取并修改了該數(shù)據(jù),T1為了對(duì)讀取值進(jìn)行檢驗(yàn)而再次讀取該數(shù)據(jù),便得到了不同的結(jié)果。
幻讀:
事務(wù)在操作過程中進(jìn)行兩次查詢,第二次查詢的結(jié)果包含了第一次查詢中未出現(xiàn)的數(shù)據(jù)或者缺少了第一次查詢中出現(xiàn)的數(shù)據(jù)
例如:系統(tǒng)管理員A將數(shù)據(jù)庫(kù)中所有學(xué)生的成績(jī)從具體分?jǐn)?shù)改為ABCDE等級(jí),但是系統(tǒng)管理員B就在這個(gè)時(shí)候插入了一條具體分?jǐn)?shù)的記錄,當(dāng)系統(tǒng)管理員A改結(jié)束后發(fā)現(xiàn)還有一條記錄沒有改過來,就好像發(fā)生了幻覺一樣。這就叫幻讀。
以上的4種問題(更新丟失、臟讀、不可重復(fù)讀、幻讀)都和事務(wù)的隔離級(jí)別有關(guān)。通過設(shè)置事務(wù)的隔離級(jí)別,可以避免上述問題的發(fā)生。
?
事物傳播行為介紹:
@Transactional(propagation=Propagation.REQUIRED) :如果有事務(wù), 那么加入事務(wù), 沒有的話新建一個(gè)(默認(rèn)情況下)
@Transactional(propagation=Propagation.NOT_SUPPORTED) :容器不為這個(gè)方法開啟事務(wù)
@Transactional(propagation=Propagation.REQUIRES_NEW) :不管是否存在事務(wù),都創(chuàng)建一個(gè)新的事務(wù),原來的掛起,新的執(zhí)行完畢,繼續(xù)執(zhí)行老的事務(wù)
@Transactional(propagation=Propagation.MANDATORY) :必須在一個(gè)已有的事務(wù)中執(zhí)行,否則拋出異常
@Transactional(propagation=Propagation.NEVER) :必須在一個(gè)沒有的事務(wù)中執(zhí)行,否則拋出異常(與Propagation.MANDATORY相反)
@Transactional(propagation=Propagation.SUPPORTS) :如果其他bean調(diào)用這個(gè)方法,在其他bean中聲明事務(wù),那就用事務(wù).如果其他bean沒有聲明事務(wù),那就不用事務(wù).
?
事物超時(shí)設(shè)置:
@Transactional(timeout=30) //默認(rèn)是30秒
?
事務(wù)隔離級(jí)別:
@Transactional(isolation = Isolation.READ_UNCOMMITTED):讀取未提交數(shù)據(jù)(會(huì)出現(xiàn)臟讀, 不可重復(fù)讀) 基本不使用
@Transactional(isolation = Isolation.READ_COMMITTED):讀取已提交數(shù)據(jù)(會(huì)出現(xiàn)不可重復(fù)讀和幻讀)
@Transactional(isolation = Isolation.REPEATABLE_READ):可重復(fù)讀(會(huì)出現(xiàn)幻讀)
@Transactional(isolation = Isolation.SERIALIZABLE):串行化
MYSQL: 默認(rèn)為REPEATABLE_READ級(jí)別
SQLSERVER: 默認(rèn)為READ_COMMITTED
Oracle?默認(rèn)隔離級(jí)別?READ_COMMITTED
轉(zhuǎn)載于:https://www.cnblogs.com/yuandluck/p/9482173.html
總結(jié)
以上是生活随笔為你收集整理的spring 事务-使用@Transactional 注解(事务隔离级别)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转载】Spring @Async 源码
- 下一篇: 用base64方法进行加密、解密: