|
常見(jiàn)1:遇到非檢測(cè)異常時(shí),事務(wù)不開(kāi)啟,也無(wú)法回滾。 原因:因?yàn)镾pring的默認(rèn)的事務(wù)規(guī)則是遇到運(yùn)行異常(RuntimeException)和程序錯(cuò)誤(Error)才會(huì)回滾。如果想針對(duì)非檢測(cè)異常進(jìn)行事務(wù)回滾,可以在@Transactional 注解里使用rollbackFor 屬性明確指定異常。 常見(jiàn)2: 在業(yè)務(wù)層捕捉異常后,發(fā)現(xiàn)事務(wù)不生效。 原因:在業(yè)務(wù)層手工捕捉并處理了異常(try..catch)等于把異常“吃”掉了,Spring自然不知道這里有錯(cuò),更不會(huì)主動(dòng)去回滾數(shù)據(jù)。推薦做法是在業(yè)務(wù)層統(tǒng)一拋出異常,然后在控制層統(tǒng)一處理。 常見(jiàn) 3 :注解到protected可見(jiàn)度的方法上,事務(wù)不生效 原因:@Transactional 注解應(yīng)該只被應(yīng)用到 public 可見(jiàn)度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不會(huì)報(bào)錯(cuò), 但是這個(gè)被注解的方法將不會(huì)展示已配置的事務(wù)設(shè)置。 Spring團(tuán)隊(duì)的建議是你在具體的類(或類的方法)上使用 @Transactional 注解,而不要使用在類所要實(shí)現(xiàn)的任何接口上。你當(dāng)然可以在接口上使用 @Transactional 注解,但是這將只能當(dāng)你設(shè)置了基于接口的代理時(shí)它才生效。因?yàn)樽⒔馐?不能繼承 的,這就意味著如果你正在使用基于類的代理時(shí),那么事務(wù)的設(shè)置將不能被基于類的代理所識(shí)別,而且對(duì)象也將不會(huì)被事務(wù)代理所包裝(將被確認(rèn)為嚴(yán)重的)。因 此請(qǐng)接受Spring團(tuán)隊(duì)的建議并且在具體的類上使用 @Transactional 注解。 |
|
|
來(lái)自: instl > 《Spring MVC》