事物指的是邏輯上的一組操作,這組操作要么全部成功,要么全部失敗.
舉例:銀行轉(zhuǎn)賬
張三轉(zhuǎn)賬給李四,張三賬戶錢被扣除了500元,李四賬戶錢增加了500元.在這個(gè)過(guò)程中不能出現(xiàn)的情況就是張三賬戶扣除500元,由于突然斷電,李四賬戶并沒(méi)有收到500元,這那么個(gè)操作就可以用事物進(jìn)行管理,會(huì)出現(xiàn)兩種情況,要么一起成功(張三轉(zhuǎn)出錢,李四收到錢),要么一起失敗(張三沒(méi)轉(zhuǎn)出錢,李四沒(méi)收到錢).
事物的相關(guān)特性:原子性,一致性,隔離性,持久性
原子性
原子性指的是事物是一個(gè)不可分割的工作單位,事物中的操作要么全部都發(fā)生,要么都不發(fā)生.(一起成功,一起失敗),不可能停留在中間某個(gè)環(huán)節(jié).事務(wù)在執(zhí)行過(guò)程中發(fā)生錯(cuò)誤,會(huì)被回滾到事務(wù)開始前的狀態(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ù)改寫但還未提交的數(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ù)