执行异常,但是事物没有全部回滚

在一个用户注册方法中,有三个数据库操作:1、生成用户save到用户表 2、用户设置的密码save到密码表 3、生成用户房间信息save到房间表

现在在步骤3、获取当前房间最大ID并设置时,由于表是空的,获得房间ID爆了org.springframework.aop.AopInvocationException: Null return value from advice does not match primitive return type for:错误的异常

然后,操作1、用户信息save的操作回滚成功, 操作2、密码表的save操作却没有回滚,导致用户注册失败后,由于2、没有回滚,用户的密码一直存在,就一直提示“注册失败,”。。。


然后1、2、3的save方法都已加了注解“@Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})”,按道理来说,遇到异常,三个应该一起回滚,然而只回滚了部分。。。

原因:和注解没有关系,是因为mysql的用户user表引擎使用了InnoDB,而2、步骤用的密码表,用的是MyISAM;而  MyISAM引擎不支持事物,所以导致了步骤2、没有回退,改为InnoDB解决.

在 Java 中,主动让事务回滚有多种方式,以下是常见的几种: ### 使用 Spring 框架的 TransactionStatus 在 Spring 框架中,当使用编程式事务管理时,可以通过 `TransactionStatus` 对象来手动回滚事务。示例代码如下: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; @Service public class TransactionService { @Autowired private JdbcTemplate jdbcTemplate; @Autowired private PlatformTransactionManager transactionManager; public void performTransaction() { // 定义事务属性 TransactionDefinition def = new DefaultTransactionDefinition(); // 获取事务状态 TransactionStatus status = transactionManager.getTransaction(def); try { // 执行数据库操作 jdbcTemplate.update("INSERT INTO users (name) VALUES ('John')"); // 模拟异常,主动回滚事务 if (true) { throw new RuntimeException("Something went wrong!"); } // 提交事务 transactionManager.commit(status); } catch (Exception e) { // 回滚事务 transactionManager.rollback(status); } } } ``` ### 使用 Spring 的 @Transactional 注解结合异常 当使用声明式事务管理时,可以通过抛出异常来触发事务回滚。`@Transactional` 注解默认会对 `RuntimeException` 及其子类进行回滚。示例代码如下: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class TransactionalService { @Autowired private JdbcTemplate jdbcTemplate; @Transactional public void performTransactionalOperation() { // 执行数据库操作 jdbcTemplate.update("INSERT INTO users (name) VALUES ('Jane')"); // 模拟异常,触发事务回滚 throw new RuntimeException("Forcing rollback!"); } } ``` ### 在 JTA 中使用 UserTransaction 在 Java 事务 API(JTA)中,可以使用 `UserTransaction` 来手动控制事务的回滚。示例代码如下: ```java import javax.annotation.Resource; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.transaction.UserTransaction; @Stateless public class JtaTransactionService { @PersistenceContext private EntityManager entityManager; @Resource private UserTransaction userTransaction; public void performJtaTransaction() { try { // 开始事务 userTransaction.begin(); // 执行数据库操作 entityManager.persist(new User("Bob")); // 模拟异常,主动回滚事务 if (true) { throw new RuntimeException("JTA rollback!"); } // 提交事务 userTransaction.commit(); } catch (Exception e) { try { // 回滚事务 userTransaction.rollback(); } catch (Exception rollbackEx) { rollbackEx.printStackTrace(); } } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值