事務(wù)四大特效ACID:
- 原子
- 一致
- 隔離
- 持久
數(shù)據(jù)不一致
- 丟失修改
T1,T2兩個(gè)事務(wù)同時(shí)對(duì)一個(gè)數(shù)據(jù)進(jìn)行修改共屈,T1先修改,T2隨后修改党窜,T2的修改覆蓋了T1修改拗引,T1修改丟失
- 讀臟數(shù)據(jù)
T1修改數(shù)據(jù)后寫入,T2讀取這個(gè)修改后的數(shù)據(jù)幌衣,T1回滾撤銷了修改寺擂,T2讀的數(shù)據(jù)就是假的無(wú)效數(shù)據(jù)
- 不可重復(fù)讀
T1讀入數(shù)據(jù),T2對(duì)數(shù)據(jù)進(jìn)行修改泼掠,如果T1再讀這個(gè)數(shù)據(jù)怔软,兩次讀入結(jié)果不同
- 幻讀
讀入數(shù)據(jù)之間插入了新的數(shù)據(jù),某個(gè)事務(wù)在讀取某個(gè)范圍內(nèi)的記錄時(shí)择镇,另一個(gè)事務(wù)會(huì)在范圍內(nèi)插入數(shù)據(jù)挡逼,當(dāng)之前事務(wù)再次讀取該記錄時(shí),會(huì)產(chǎn)生幻行
隔離級(jí)別
- 未提交讀 read uncommitted
有臟讀腻豌,可讀取其他事務(wù)未提交的數(shù)據(jù)
- 提交讀 read committed
只能讀取已提交數(shù)據(jù)家坎,避免臟讀,允許不可重復(fù)讀和幻讀 (sqlServer oracle默認(rèn))
- 可重復(fù)讀 repeatable read
有幻讀吝梅,同一個(gè)事務(wù)中多次讀取同樣的記錄結(jié)果一致虱疏, 避免臟讀,不可重復(fù)讀苏携,允許幻讀(mysql innoDB默認(rèn))
- 可串行化 serialixable
強(qiáng)制事務(wù)串行執(zhí)行做瞪,事務(wù)只能一個(gè)一個(gè)執(zhí)行,避免了臟讀右冻、不可重復(fù)讀装蓬、幻讀。執(zhí)行效率慢纱扭,使用時(shí)慎重
Spring事務(wù)
@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
方法上添加標(biāo)簽牍帚,執(zhí)行dao層時(shí)拋出錯(cuò)誤就會(huì)回滾,propagation參數(shù)為方法調(diào)用之間事務(wù)的處理方式乳蛾,rollbackFor為哪些check錯(cuò)誤捕獲回滾暗赶,不添加則只回滾uncheck錯(cuò)誤
- required
支持當(dāng)前事務(wù)鄙币,如果當(dāng)前沒(méi)有事務(wù),就新建事務(wù)蹂随。默認(rèn)爱榔,
- required_new
新建事務(wù),如果當(dāng)前存在事務(wù)糙及,就把當(dāng)前事務(wù)掛起详幽。新建的事務(wù)將和被掛機(jī)的事務(wù)沒(méi)有關(guān)系,相互獨(dú)立浸锨,外層事務(wù)失敗回滾唇聘,內(nèi)存事務(wù)不回滾,內(nèi)存事務(wù)拋出異常失敗回滾柱搜,外層事務(wù)捕獲到異常迟郎,也可以不回滾
- supports
支持當(dāng)前事務(wù),如果當(dāng)前沒(méi)有事務(wù)就以非事務(wù)方式執(zhí)行
- mandatory 強(qiáng)制
支持當(dāng)前事務(wù)聪蘸,如果當(dāng)前沒(méi)有事務(wù)宪肖,就拋出異常
- not_supported
以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù)健爬,就把當(dāng)前事務(wù)掛起
- never
以非事務(wù)方式執(zhí)行控乾,如果當(dāng)前存在事務(wù),則拋出異常
- nested
如果一個(gè)活動(dòng)的事務(wù)存在娜遵,則運(yùn)行在一個(gè)嵌套的事務(wù)中蜕衡。如果沒(méi)有活動(dòng)事務(wù),則按REQUIRED屬性執(zhí)行设拟。它使用了一個(gè)單獨(dú)的事務(wù)慨仿,這個(gè)事務(wù)擁有多個(gè)可以回滾的保存點(diǎn)。內(nèi)部事務(wù)的回滾不會(huì)對(duì)外部事務(wù)造成影響纳胧。它只對(duì)DataSourceTransactionManager事務(wù)管理器起效镰吆。(意思就是可以同時(shí)滿足required特性和required_new特性)