事物指的是邏輯上的一組操作,這組操作要么全部成功,要么全部失敗.
舉例:銀行轉(zhuǎn)賬
張三轉(zhuǎn)賬給李四,張三賬戶錢(qián)被扣除了500元,李四賬戶錢(qián)增加了500元.在這個(gè)過(guò)程中不能出現(xiàn)的情況就是張三賬戶扣除500元,由于突然斷電,李四賬戶并沒(méi)有收到500元,這那么個(gè)操作就可以用事物進(jìn)行管理,會(huì)出現(xiàn)兩種情況,要么一起成功(張三轉(zhuǎn)出錢(qián),李四收到錢(qián)),要么一起失敗(張三沒(méi)轉(zhuǎn)出錢(qián),李四沒(méi)收到錢(qián)).
事物的相關(guān)特性:原子性,一致性,隔離性,持久性
原子性
原子性指的是事物是一個(gè)不可分割的工作單位,事物中的操作要么全部都發(fā)生,要么都不發(fā)生.(一起成功,一起失敗),不可能停留在中間某個(gè)環(huán)節(jié).事務(wù)在執(zhí)行過(guò)程中發(fā)生錯(cuò)誤,會(huì)被回滾到事務(wù)開(kāi)始前的狀態(tài),就想這個(gè)事務(wù)從來(lái)沒(méi)有被執(zhí)行一樣.
一致性
一致性指事物前后數(shù)據(jù)的完整性必須保持一致(轉(zhuǎn)賬前后,兩個(gè)人的銀行賬戶總和不改變)
隔離性
隔離性指多個(gè)用戶并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)是,一個(gè)用戶的事務(wù)不能被其他用戶的事務(wù)所干擾,多個(gè)并發(fā)事務(wù)之間的數(shù)據(jù)要相互隔離 (重復(fù)修改數(shù)據(jù),修改數(shù)據(jù)就會(huì)被覆蓋)
持久性
持久性是指一個(gè)一個(gè)事務(wù)一旦被提交,它對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變就是永久性的,即使數(shù)據(jù)庫(kù)發(fā)生故障也不應(yīng)該對(duì)其有任何影響,不會(huì)被回滾
Spring事務(wù)管理高層接口主要包括3個(gè)接口,PlatformTransactionManager平臺(tái)事務(wù)管理器,TransactionDefinition 事務(wù)定義信息(隔離,傳播,超時(shí),只讀),TransationStatus事務(wù)具體運(yùn)行狀態(tài)
平臺(tái)事務(wù)管理器PlatformTransationManager
Spring為不同的持久化框架
提供了不同的PlatformTransactionManager接口實(shí)現(xiàn)
TransactionDefinition 事務(wù)定義信息(隔離,傳播,超時(shí),只讀)
如果不考慮隔離性,就會(huì)引發(fā)安全問(wèn)題如下:
臟讀,不可重復(fù)讀,幻讀(虛讀)
隔離級(jí)別就是解決讀出現(xiàn)的問(wèn)題的
臟讀:
一個(gè)事務(wù)讀取了另外一個(gè)事務(wù)改寫(xiě)但還未提交的數(shù)據(jù),如果這些數(shù)據(jù)被回滾,則讀到的數(shù)據(jù)是無(wú)效的
不可重復(fù)讀:
在同一事務(wù)中,多次讀取同一數(shù)據(jù)返回的結(jié)果有所不同
幻讀:
一個(gè)事務(wù)讀取了幾行記錄后,另外一個(gè)事務(wù)插入一些記錄,幻讀就發(fā)生了.再后來(lái)的查詢中,第一個(gè)事務(wù)就會(huì)發(fā)現(xiàn)有些原來(lái)沒(méi)有的記錄
事務(wù)的隔離級(jí)別如下圖:
MySQL數(shù)據(jù)庫(kù)默認(rèn)采用REPEATABLE_READ隔離級(jí)別
Oracle數(shù)據(jù)庫(kù)默認(rèn)采用READ_COMMITTED隔離級(jí)別
事務(wù)的傳播行為(業(yè)務(wù)層方法的相互調(diào)用產(chǎn)生的事務(wù)的處理辦法)
TransationStatus事務(wù)具體運(yùn)行狀態(tài)
代表一個(gè)事務(wù)的具體運(yùn)行狀態(tài)
枢纠。事務(wù)管理器通過(guò)該接口獲取事務(wù)的運(yùn)行期的狀態(tài)信息竖瘾,也可以通過(guò)該接口間接的回滾事務(wù)拐迁,它相比于在拋出異常時(shí)回滾事務(wù)的方式更具有可控性.
包含以下方法:
boolean hasSavepoint():
當(dāng)前的不是都是否在內(nèi)部創(chuàng)建了一個(gè)保存點(diǎn)步淹,保存點(diǎn)是為了支持Spring的嵌套事務(wù)而創(chuàng)建的
boolean isNewTransaction():
判斷一個(gè)事務(wù)是否為新的事務(wù)
boolean isCompleted():
判斷事務(wù)是否已結(jié)束
boolean isRollbackOnly():
當(dāng)前事務(wù)是否已經(jīng)被標(biāo)示為rollback-only
void setRollbackOnly():
將當(dāng)前事務(wù)設(shè)置為rollback-only贾费,通過(guò)該標(biāo)識(shí)通知事務(wù)管理器只能將事務(wù)回滾,事務(wù)管理器將顯式調(diào)用回滾命令或拋出異常的方式回滾事務(wù)