版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第Spring系列之事物管理這些管理器都實(shí)現(xiàn)了PlatformTransactionManager中的三個(gè)接口,實(shí)現(xiàn)邏輯略有差別,但是對(duì)用戶來(lái)講區(qū)別不大
定義事物的一些參數(shù):
一些事物的參數(shù)在TransactionDefinition.java中,詳情如下:
publicinterfaceTransactionDefinition{
intPROPAGATION_REQUIRED=0;
intPROPAGATION_SUPPORTS=1;
intPROPAGATION_MANDATORY=2;
intPROPAGATION_REQUIRES_NEW=3;
intPROPAGATION_NOT_SUPPORTED=4;
intPROPAGATION_NEVER=5;
intPROPAGATION_NESTED=6;
//默認(rèn)隔離級(jí)別,和數(shù)據(jù)庫(kù)的隔離級(jí)別一致
intISOLATION_DEFAULT=-1;
intISOLATION_READ_UNCOMMITTED=1;
intISOLATION_READ_COMMITTED=2;
intISOLATION_REPEATABLE_READ=4;
intISOLATION_SERIALIZABLE=8;
//默認(rèn)不超時(shí)
intTIMEOUT_DEFAULT=-1;
}
下面兩張圖對(duì)這些參數(shù)進(jìn)行了說(shuō)明:
7種事務(wù)傳播特性:
四種事務(wù)隔離級(jí)別:
在看事務(wù)隔離級(jí)別前需要先了解下什么是臟讀、不可重復(fù)讀、幻讀
臟讀:臟讀就是一個(gè)事物未提交的數(shù)據(jù),被另外一個(gè)事物讀到了,顯然這種情況不可接受
不可重復(fù)讀:不可重復(fù)讀是指在一個(gè)事務(wù)內(nèi),多次讀同一數(shù)據(jù),前后讀取的結(jié)果不一致。
幻讀:事務(wù)A對(duì)表中的一個(gè)數(shù)據(jù)進(jìn)行了修改,這種修改涉及到表中的全部數(shù)據(jù)行。同時(shí)事務(wù)B也修改了這個(gè)表中的數(shù)據(jù),這種修改是向表中插入一行新數(shù)據(jù)。那么就會(huì)發(fā)生操作事務(wù)A的用戶發(fā)現(xiàn)表中還存在沒(méi)有修改的數(shù)據(jù)行,就好像發(fā)生了幻覺(jué)一樣
知道了以上幾個(gè)概念,我們來(lái)看看隔離級(jí)別:
這里我們可以看到,Spring并不是提供了所有的事物管理的實(shí)現(xiàn),而是提供了標(biāo)準(zhǔn)的事物管理器的操作接口PlatformTransactionManager,并且規(guī)范了其行為,具體的事物實(shí)現(xiàn)由各個(gè)平臺(tái)自行實(shí)現(xiàn)。這就是Spring的事物抽象。
Spring之編程式事物
Spring提供了TransactionTemplate工具類可以很方便的使用編程式事務(wù)。默認(rèn)情況下TransactionTemplate使用的是DataSourceTransactionManager。
在Spring上下文中,我們不配置TransactionTemplate這個(gè)bean,也能獲取到TransactionTemplate。比如下面的例子。
@Service
publicclassUserInfoService{
@Resource
privateUserInfoDAOuserInfoDAO;
@Autowired
privateTransactionTemplatetransactionTemplate;
publicvoidupdateUser1(){
transactionTemplate.execute(transactionStatus-{
userInfoDAO.updateUserName(1,"zhangsanfeng");
transactionTemplate.execute(transactionStatus2-{
userInfoDAO.updateUserName(2,"lisi");
returnnull;
returnnull;
}
由于Spring默認(rèn)的事物傳播特性是PROPAGATION_REQUIRED,我們來(lái)做一下驗(yàn)證,看是不是這樣
上面兩幅圖可以看出,TransactionStatus中的newTransaction屬性,第一個(gè)是true,第二個(gè)是false,正好符合PROPAGATION_REQUIRED所描述的情況。其他的傳播特性可以自己去驗(yàn)證。
聲明式事物
除了編程式事物外,Spring還為我們提供了聲明式事物。使用@Transactional注解。
@Transactional可以作用于接口、接口方法、類以及類方法上。當(dāng)作用于類上時(shí),該類的所有public方法將都具有該類型的事務(wù)屬性,同時(shí),我們也可以在方法級(jí)別使用該注解來(lái)覆蓋類級(jí)別的定義。
雖然@Transactional注解可以作用于接口、接口方法、類以及類方法上,但是Spring建議不要在接口或者接口方法上使用該注解,因?yàn)檫@只有在使用基于接口的代理時(shí)它才會(huì)生效。另外,@Transactional注解應(yīng)該只被應(yīng)用到public方法上,這是由SpringAOP的本質(zhì)決定的。如果你在protected、private或者默認(rèn)可見(jiàn)性的方法上使用@Transactional注解,這將被忽略,也不會(huì)拋出任何異常。
@Transactional的rollbackFor屬性可以設(shè)置一個(gè)Throwable的數(shù)組,用來(lái)表明如果方法拋出這些異常,則進(jìn)行事務(wù)回滾。默認(rèn)情況下如果不配置rollbackFor屬性,那么事務(wù)只會(huì)在遇到RuntimeException的時(shí)候才會(huì)回滾。
下面的代碼事物就不會(huì)生效:
@Transactional
publicvoidupdateUser2()throwsException{
intr1=userInfoDAO.updateUserName(1,"wanger");
intr2=userInfoDAO.updateUserName(2,"mawu");
if(r2==1){
thrownewException();
}
如果我們把拋出的異常改成RuntimeException,這時(shí)候事物就會(huì)生效了。或者指定異常讓事物生效,比如@Transactional(rollbackFor=Exception.class),這樣碰到所有的異常事物都會(huì)生效了。
為什么加了@Transactional注解事物就生效了?
這是因?yàn)镾pring容器會(huì)為加了這個(gè)注解的對(duì)象生成一個(gè)代理對(duì)象,實(shí)際調(diào)用的時(shí)候,實(shí)際上是調(diào)用的代理對(duì)象。代理對(duì)象的實(shí)現(xiàn)了AOP的增強(qiáng),實(shí)現(xiàn)了事物的實(shí)現(xiàn)。
通過(guò)注解怎么實(shí)現(xiàn)指定的傳播特性和隔離級(jí)別的?
public@interfaceTransactional{
@AliasFor("transactionManager")
Stringvalue()default"";
@AliasFor("value")
StringtransactionManager()default"";
String[]label()default{};
Propagationpropagation()defaultPropagation.REQUIRED;
Isolationisolation()defaultIsolation.DEFAULT;
inttimeout()default-1;
StringtimeoutString()default"";
booleanreadOnly()defaultfalse;
ClassextendsThrowable[]rollbackFor()default{};
String[]rollbackForClassName()default{};
ClassextendsThrowable[]noRollbackFor()default{};
String[]noRollbackForClassName()default{};
}
代碼中可以看出,我們可以指定隔離級(jí)別和傳播特性,在Spring為我們生成代理類的時(shí)候,會(huì)讀取這些屬性,體現(xiàn)在增強(qiáng)邏輯中。
事物失效的8種情況及解決辦法
數(shù)據(jù)庫(kù)引擎不支持事務(wù)
這里以MySQL為例,其MyISAM引擎是不支持事務(wù)操作的,InnoDB才是支持事務(wù)的引擎,一般要支持事務(wù)都會(huì)使用InnoDB,這時(shí)候選擇支持事物的數(shù)據(jù)庫(kù)即可(好像是廢話,哈哈哈)
沒(méi)有被Spring管理
這個(gè)好像沒(méi)什么可說(shuō)的,脫離了Spring的管理,還談什么Spring事物管理。
方法不是public的
@Transactional只能用于public的方法上,否則事務(wù)不會(huì)失效,如果要用在非public方法上,可以開啟AspectJ代理模式。
數(shù)據(jù)源沒(méi)有配置事務(wù)管理器
相當(dāng)于沒(méi)開啟事務(wù)管理,如果不是Springboot情況需要進(jìn)行如下操作。
@Bean
publicPlatformTransactionManagertransactionManager(DataSourcedataSource){
returnnewDataSourceTransactionManager(dataSource);
}
如果是SpringBoot,在啟動(dòng)類上直接加上注解@EnableTransactionManagement即可。
傳播特性配錯(cuò)了
傳播特性配置成,Propagation.NOT_SUPPORTED或者Propagation.NOT_SUPPORTED,改成支持事物的傳播特性即可。
異常類型錯(cuò)誤
因?yàn)槟J(rèn)的異常類型是運(yùn)行時(shí)異常,如果拋出了其他異常就不生效。
解決方式:
1、將異常改成運(yùn)行時(shí)異常
2、指定異常進(jìn)行事物回滾,如:@Transactional(rollbackFor=Exception.class)
異常被吃掉了
如果你代碼這么寫,事物不生效:
@Transactional(rollbackFor=Exception.class)
publicvoidupdateUser2(){
intr1=userInfoDAO.updateUserName(1,"3");
intr2=userInfoDAO.updateUserName(2,"4");
if(r2==1){
thrownewRuntimeException();
try{
}catch(Exceptione){
}
解決辦法:必須要拋出異常,否則Spring事務(wù)管理,不會(huì)走到回滾邏輯
類內(nèi)部調(diào)用
@Service
publicclassUserInfoService{
publicvoidjustUpdate(){
updateUser2();
@Transactional(rollbackFor=Exception.class)
publicvoidupdateUser2(){
}
上述代碼不生效,因?yàn)閮?nèi)部調(diào)用不會(huì)涉及到代理類的調(diào)用,更不會(huì)有AOP的增強(qiáng),因此不會(huì)生效。
解決辦法:
1、自注入
@Service
publicclassUserInfoService{
@Autowired
privateUserInfoServiceuserInfoService;
publicvoidjustUpdate(){
userInfoService.updateUser2();
@Transactional(rollbackFor=Exception.class)
publicvoidupdateUser2(){
}
2、Spring上下文
@Service
publicclassUserInfoService{
ApplicationContextapplicationContext;
publ
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年中色國(guó)際礦業(yè)股份有限公司招聘?jìng)淇碱}庫(kù)及參考答案詳解一套
- 2026年國(guó)航股份西南分公司招聘乘務(wù)員備考題庫(kù)及一套參考答案詳解
- 2026年保定市英華學(xué)校招聘初高中各學(xué)科教師備考題庫(kù)及一套答案詳解
- 2026年北京市朝陽(yáng)區(qū)教育委員會(huì)所屬事業(yè)單位面向應(yīng)屆畢業(yè)生及出站博士后公開招聘?jìng)淇碱}庫(kù)帶答案詳解
- 2026年四川大學(xué)華西公共衛(wèi)生學(xué)院華西第四醫(yī)院臨床護(hù)士招聘?jìng)淇碱}庫(kù)及參考答案詳解
- 2026年五指山熱帶雨林旅游文化投資集團(tuán)有限公司招聘?jìng)淇碱}庫(kù)完整答案詳解
- 2026年嘉興市海寧中學(xué)代課教師招聘?jìng)淇碱}庫(kù)及答案詳解一套
- 2026年合肥市某金融公司招聘勞務(wù)派遣工作人員備考題庫(kù)及答案詳解一套
- 2026年中電建建筑集團(tuán)有限公司招聘?jìng)淇碱}庫(kù)及參考答案詳解一套
- 2026年四川長(zhǎng)虹電子控股集團(tuán)有限公司長(zhǎng)虹國(guó)際品牌關(guān)于招聘電商運(yùn)營(yíng)經(jīng)理崗位的備考題庫(kù)及1套參考答案詳解
- 14J936《變形縫建筑構(gòu)造》
- 魯班鎖魯班球課件
- 新概念英語(yǔ)第二冊(cè)階段一練習(xí)冊(cè)
- 2024屆河北省石家莊市普通高中學(xué)校畢業(yè)年級(jí)教學(xué)質(zhì)量摸底檢測(cè)物理試卷含答案
- 建設(shè)工程施工內(nèi)部承包協(xié)議
- 【角色游戲?qū)?duì)幼兒社會(huì)性發(fā)展影響及促進(jìn)對(duì)策7900字(論文)】
- 第四講 Meta分析的數(shù)據(jù)提取與分析-課件
- 宮內(nèi)節(jié)育器放置術(shù)
- 新制定《無(wú)障礙環(huán)境建設(shè)法》主題PPT
- 期末復(fù)習(xí)主題班會(huì)
- 道路交通基礎(chǔ)設(shè)施韌性提升
評(píng)論
0/150
提交評(píng)論