1.事務(wù)的傳播機(jī)制?? 2.事務(wù)隔離機(jī)制?? 3.只讀?? 4.事務(wù)超時???? 5.回滾規(guī)則
1.事務(wù)的特性:
原子性:事務(wù)是一個原子操作假夺,由一系列動作組成。確保動作要么全部成功哪工,要么失敗回滾奥此。
一致性:一旦事務(wù)完成,不管是成功還是失敗雁比,系統(tǒng)必須確保它所建模的業(yè)務(wù)處于一致性的狀態(tài)稚虎,而不是部分完成部分失敗,在現(xiàn)實(shí)中的數(shù)據(jù)不應(yīng)該被破壞偎捎。
隔離性:可能會有許多事務(wù)來處理相同的數(shù)據(jù)蠢终,因此每個事務(wù)都應(yīng)該與其他事務(wù)隔離開來,防止數(shù)據(jù)損壞茴她。
永久性:一旦事務(wù)完成寻拂,不管系統(tǒng)發(fā)生任何錯誤,他的結(jié)果都不應(yīng)該受到影響丈牢,通常情況下祭钉,事務(wù)的結(jié)果被寫入到持久化存儲器中。
2.Spring支持編程式事務(wù)管理和聲明式事務(wù)管理兩種方式
1.編程式事務(wù)管理是侵入性事務(wù)管理己沛,使用TransactionTemplate或者直接使用PlatformTransactionManager慌核,對于編程式事務(wù)管理距境,Spring推薦使用TransactionTemplate。
2.聲明式事務(wù)管理建立在AOP之上垮卓,其本質(zhì)是對方法前后進(jìn)行攔截垫桂,然后在目標(biāo)方法開始之前創(chuàng)建或者加入一個事務(wù),執(zhí)行完目標(biāo)方法之后根據(jù)執(zhí)行的情況提交或者回滾粟按。
編程式事務(wù)每次實(shí)現(xiàn)都要單獨(dú)實(shí)現(xiàn)诬滩,但業(yè)務(wù)量大功能復(fù)雜時,使用編程式事務(wù)無疑是痛苦的灭将,而聲明式事務(wù)不同碱呼,聲明式事務(wù)屬于無侵入式,不會影響業(yè)務(wù)邏輯的實(shí)現(xiàn)宗侦,只需要在配置文件中做相關(guān)的事務(wù)規(guī)則聲明或者通過注解的方式,便可以將事務(wù)規(guī)則應(yīng)用到業(yè)務(wù)邏輯中忆蚀。
顯然聲明式事務(wù)管理要優(yōu)于編程式事務(wù)管理矾利,這正是Spring倡導(dǎo)的非侵入式的編程方式。唯一不足的地方就是聲明式事務(wù)管理的粒度是方法級別馋袜,而編程式事務(wù)管理是可以到代碼塊的男旗,但是可以通過提取方法的方式完成聲明式事務(wù)管理的配置
3.Spring事務(wù)的傳播機(jī)制
事務(wù)的傳播性一般用在事務(wù)嵌套的場景,比如一個事務(wù)方法里面調(diào)用了另外一個事務(wù)方法欣鳖,那么兩個方法是各自作為獨(dú)立的方法提交還是內(nèi)層的事務(wù)合并到外層的事務(wù)一起提交察皇,這就是需要事務(wù)傳播機(jī)制的配置來確定怎么樣執(zhí)行。
常用的事務(wù)傳播機(jī)制如下:
PROPAGATION_REQUIREDSpring默認(rèn)的傳播機(jī)制泽台,能滿足絕大部分業(yè)務(wù)需求什荣,如果外層有事務(wù),則當(dāng)前事務(wù)加入到外層事務(wù)怀酷,一塊提交稻爬,一塊回滾。如果外層沒有事務(wù)蜕依,新建一個事務(wù)執(zhí)行桅锄。
PROPAGATION_REQUES_NEW該事務(wù)傳播機(jī)制是每次都會新開啟一個事務(wù),同時把外層事務(wù)掛起样眠,當(dāng)當(dāng)前事務(wù)執(zhí)行完畢友瘤,恢復(fù)上層事務(wù)的執(zhí)行。如果外層沒有事務(wù)檐束,執(zhí)行當(dāng)前新開啟的事務(wù)即可辫秧。
PROPAGATION_SUPPORT如果外層有事務(wù),則加入外層事務(wù)厢塘,如果外層沒有事務(wù)茶没,則直接使用非事務(wù)方式執(zhí)行肌幽。完全依賴外層的事務(wù)。
PROPAGATION_NOT_SUPPORT該傳播機(jī)制不支持事務(wù)抓半,如果外層存在事務(wù)則掛起喂急,執(zhí)行完當(dāng)前代碼,則恢復(fù)外層事務(wù)笛求,無論是否異常都不會回滾當(dāng)前的代碼廊移。
PROPAGATION_NEVER該傳播機(jī)制不支持外層事務(wù),即如果外層有事務(wù)就拋出異常探入。
PROPAGATION_MANDATORY與NEVER相反狡孔,如果外層沒有事務(wù),則拋出異常蜂嗽。
PROPAGATION_NESTED該傳播機(jī)制的特點(diǎn)是可以保存狀態(tài)保存點(diǎn)苗膝,當(dāng)前事務(wù)回滾到某一個點(diǎn),從而避免所有的嵌套事務(wù)都回滾植旧,即各自回滾各自的辱揭,如果子事務(wù)沒有把異常吃掉,基本還是會引起全部回滾的病附。
4.Spring事務(wù)的隔離級別
事務(wù)的隔離級別定義一個事務(wù)可能受其他并發(fā)務(wù)活動活動影響的程度问窃,可以把事務(wù)的隔離級別想象為這個事務(wù)對于事物處理數(shù)據(jù)的自私程度。
臟讀:臟讀發(fā)生在一個事務(wù)讀取了被另一個事務(wù)改寫但尚未提交的數(shù)據(jù)時完沪。如果這些改變在稍后被回滾了域庇,那么第一個事務(wù)讀取的數(shù)據(jù)就會是無效的。
不可重復(fù)讀:不可重復(fù)讀發(fā)生在一個事務(wù)執(zhí)行相同的查詢兩次或兩次以上覆积,但每次查詢結(jié)果都不相同時听皿。這通常是由于另一個并發(fā)事務(wù)在兩次查詢之間更新了數(shù)據(jù)。
幻讀:幻讀和不可重復(fù)讀相似技健。當(dāng)一個事務(wù)(T1)讀取幾行記錄后写穴,另一個并發(fā)事務(wù)(T2)插入了一些記錄時,幻讀就發(fā)生了雌贱。在后來的查詢中啊送,第一個事務(wù)(T1)就會發(fā)現(xiàn)一些原來沒有的額外記錄。