您好,登錄后才能下訂單哦!
這篇文章主要講解了如何解決Java注解@Transactional事務(wù)類內(nèi)調(diào)用不生效問題,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。
@Transactional 內(nèi)部調(diào)用例子
在 Spring 的 AOP 代理下,只有目標(biāo)方法由外部調(diào)用,目標(biāo)方法才由 Spring 生成的代理對(duì)象來(lái)管理,這會(huì)造成自調(diào)用問題。
若同一類中的其他沒有@Transactional 注解的方法內(nèi)部調(diào)用有@Transactional 注解的方法,有@Transactional 注解的方法的事務(wù)被忽略,不會(huì)發(fā)生回滾
@Service public class A{ public void action(){ dosome(); } @Transactional public void dosome(){ doa.insert(new Object()); } }
如上代碼,在方法dosome()中拋出異常時(shí),數(shù)據(jù)操作不會(huì)回滾
解決方案
思路: 強(qiáng)制使用 AspectJ 對(duì)方法進(jìn)行切面
Springboot 引入 AspectJ 切面
pom.xml 中添加AspectJ:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.5</version> </dependency>
啟動(dòng)類中添加 @EnableAspectJAutoProxy(exposeProxy = true)
@SpringBootApplication @EnableAspectJAutoProxy(exposeProxy = true) public class DonngPartsApplication { public static void main(String[] args) { SpringApplication.run(DonngPartsApplication.class, args); } }
注意: exposeProxy = true 若不添加,則會(huì)報(bào):
java.lang.IllegalStateException:
Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available,
and ensure that AopContext.currentProxy() is invoked in the same thread as the AOP invocation context.
代碼中 ((A) AopContext.currentProxy()).dosome()
修改為如下代碼,事務(wù)就生效啦
@Service public class A{ public void action(){ ((A) AopContext.currentProxy()).dosome(); } @Transactional public void dosome(){ doa.insert(new Object()); } }
@Transactional 進(jìn)階
1. @Transactional 注解的屬性信息
屬性 | 描述 |
---|---|
name | 當(dāng)在配置文件中有多個(gè) TransactionManager , 可以用該屬性指定選擇哪個(gè)事務(wù)管理器 |
propagation | 事務(wù)的傳播行為,默認(rèn)值為 REQUIRED |
isolation | 事務(wù)的隔離度,默認(rèn)值采用 DEFAULT |
timeout | 事務(wù)的超時(shí)時(shí)間,默認(rèn)值為-1。如果超過(guò)該時(shí)間限制但事務(wù)還沒有完成,則自動(dòng)回滾事務(wù) |
read-only | 指定事務(wù)是否為只讀事務(wù),默認(rèn)值為 false;為了忽略那些不需要事務(wù)的方法,比如讀取數(shù)據(jù),可以設(shè)置 read-only 為 true |
rollback-for | 用于指定能夠觸發(fā)事務(wù)回滾的異常類型,如果有多個(gè)異常類型需要指定,各類型之間可以通過(guò)逗號(hào)分隔 |
no-rollback- for | 拋出 no-rollback-for 指定的異常類型,不回滾事務(wù) |
2. propagation 傳播行為
3. 事物超時(shí)設(shè)置
@Transactional(timeout=30) //默認(rèn)是30秒
4. 事務(wù)隔離級(jí)別 isolation
注意
@Transactional 只能被應(yīng)用到public方法上
僅僅@Transactional 注解的出現(xiàn)不足于開啟事務(wù)行為,它僅僅是一種元數(shù)據(jù)
看完上述內(nèi)容,是不是對(duì)如何解決Java注解@Transactional事務(wù)類內(nèi)調(diào)用不生效問題有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。