关于Spring声明式事务抛运行时异常时不回滚数据库

文章详细介绍了在使用Spring整合Hibernate进行事务处理时遇到RuntimeException且未正确回滚数据库的问题,通过检查数据库表类型并修改为InnoDB类型解决了此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨日,本人学习spring整合hibernate,在声明式事务处理时遇到问题了,令我百思不得其解。
问题:在事务处理时抛了RuntimeException却没有回滚数据库,还是往数据库中插入了值
解决:今天在Google上找了半天,没有找到解决办法。我就想,是不是数据库的问题呢?就在网上找MySQL关于数据库回滚的问题,终于让我找到了

1.首先,查看你数据库中表的类型是否支持回滚 命令为:show table status;,我就发现在我的表类型为MYISAM,这种类型默认不支持回滚,而InnoDB支持
2.问题查出来了,现在怎么把类型改为InnoDB类型呢?在MySQL中输入命令:alter table tablename engine = InnoDB;
好啦,大功造成了,再用Spring+hibernate抛运行时异常时果然回滚啦
### Spring 声明式事务异常处理与回滚配置 在Spring框架中,声明式事务管理通过`@Transactional`注解来简化事务操作。为了确保当特定异常发生能正确触发事务回滚,需遵循一定的配置原则。 #### 配置回滚规则 默认情况下,只有未检查的异常(即继承自`RuntimeException`或`Error`)才会导致事务自动回滚[^1]。对于已检查异常(Checked Exception),如`IOException`等,则会触发回滚行为,除非显式指定了这些类型的异常作为回滚条件。 要使某些特定的已检异常也能够引起回滚,可以利用`@Transactional`注解中的`rollbackFor`参数来进行设定: ```java @Transactional(rollbackFor = {SQLException.class, MyCustomException.class}) public void performServiceOperation() { // Service logic here... } ``` 上述例子表明,在服务层的方法`performServiceOperation()`执行期间一旦出`SQLException`或是自定义异常`MyCustomException`,都将促使整个事务被撤销并且回退到初始状态[^2]。 #### 实现示例 下面给出一段具体的Java代码片段展示如何应用以上概念: ```java @Service public class UserService { @Autowired private UserDao userDao; /** * 插入新用户记录,并故意制造除零错误以测试事务回滚机制。 */ @Transactional(rollbackFor = ArithmeticException.class) public void insertUserWithError() { try { userDao.insert(); System.out.println("插入完成"); // 故意引发算术运算异常模拟业务逻辑失败场景 int i = 1 / 0; } catch (ArithmeticException e) { throw new ArithmeticException("发生了除数为零的操作", e); } } } ``` 在此案例里,即使`userDao.insert();`成功写入了一条新的用户数据至数据库表内,但由于后续出现了可接受的程序运行状况——尝试做非法的整数除法运算,这将激活由`@Transactional`所规定的针对`ArithmeticException`类别的回滚策略,从而保证之前所做的任何持久化更改都会生效[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值