事物异常

[10-7-19 8:25:24:493 GMT+08:00] 634a40 SystemErr R javax.transaction.TransactionRolledbackException: CORBA TRANSACTION_ROLLEDBACK 0x0 No; nested exception is:
org.omg.CORBA.TRANSACTION_ROLLEDBACK: javax.transaction.TransactionRolledbackException: vmcid: 0x0 minor code: 0 completed: No
Spring中事务回滚的异常情况如下: - **声明式事务管理(AOP事务)**:默认情况下,针对`uncheckException`(运行时异常)回滚,也就是对`RuntimeException`异常或是其子类进行事务回滚,其他异常(`checkException`)不回滚。例如,当业务方法抛出`RuntimeException`及其子类异常时,事务会自动回滚;若抛出的是其他非运行时异常,事务默认不回滚。不过,若使用`try - catch`捕获抛出的`unchecked`异常后,没有在`catch`块中采用页面硬编码的方式使用spring api对事务做显式的回滚,则事务不会回滚。若要捕获非运行时异常则需要特殊配置,如在针对事务的类中抛出`RuntimeException`异常,而不是抛出`Exception`,并且增加`rollback - for`配置,里面写自己的异常类型[^2]。 - **基于注解的事务(`@Transactional`)**:异常控制默认也是`checkException`不回滚,`uncheckException`回滚。如果配置了`rollbackFor`和`noRollbackFor`且两个都是用同样的异常,那么遇到该异常,还是会回滚。同时,`rollbackFor`和`noRollbackFor`配置也许不会涵盖所有异常,对于遗漏的异常继续按照`checkException`不回滚,`uncheckException`回滚的规则处理。另外,可以通过`@Transactional`注解中的`rollbackFor`属性指定哪些异常触发回滚,例如`@Transactional(rollbackFor = Exception.class)`,这样即使抛出`Exception`也能回滚事务[^2][^3][^4]。 ### 代码示例 ```java import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; public class TransactionExample { // 声明式事务示例,默认对RuntimeException及其子类回滚 @Transactional public void businessMethod1() { // 业务逻辑代码 throw new RuntimeException("模拟运行时异常"); } // 捕获异常但手动回滚 public void businessMethod2() { try { // 业务逻辑代码 throw new RuntimeException("模拟运行时异常"); } catch (Exception e) { // 手动回滚事务 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } } // 通过rollbackFor指定异常回滚 @Transactional(rollbackFor = Exception.class) public void businessMethod3() throws Exception { // 业务逻辑代码 throw new Exception("模拟非运行时异常"); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值