springboot项目 添加 @Transactional(rollbackFor = Exception.class) 注解 抛出异常后sqlserver数据库不进行回滚
时间: 2023-11-11 17:07:31 浏览: 52
可能是因为你的数据库驱动不支持自动提交事务,需要手动提交事务。可以在方法结束前手动提交事务,例如:
```
@Service
public class MyService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Transactional(rollbackFor = Exception.class)
public void myMethod() {
try {
// 执行数据库操作
jdbcTemplate.update("INSERT INTO my_table (name) VALUES (?)", "test");
} catch (Exception e) {
// 抛出异常
throw new RuntimeException(e);
}
// 手动提交事务
TransactionAspectSupport.currentTransactionStatus().flush();
}
}
```
在方法结束前,调用 `TransactionAspectSupport.currentTransactionStatus().flush()` 手动提交事务。这样即使抛出异常,事务也会回滚。
相关问题
@Transactional(rollbackFor = Exception.class) 回滚SQL异常
在使用Spring框架进行事务管理时,@Transactional注解可以用来标记需要进行事务管理的方法。当方法执行过程中出现异常时,@Transactional注解可以自动回滚事务。但是默认情况下,@Transactional只会对RuntimeException和Error类型的异常进行回滚,对于SQLException等其他类型的异常不会进行回滚。因此,需要在@Transactional注解中使用rollbackFor属性来指定需要回滚的异常类型。
具体来说,如果需要对SQLException进行回滚,可以在@Transactional注解中添加rollbackFor属性,如下所示:
```java
@Transactional(rollbackFor = SQLException.class)
public void someMethod() {
// do something that may throw SQLException
}
```
上述代码中,@Transactional注解中的rollbackFor属性指定了需要回滚的异常类型为SQLException。当someMethod()方法执行过程中出现SQLException异常时,事务会自动回滚。
@Override @Transactional(isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
在Spring项目中,使用`@Transactional`注解可以为方法添加事务支持。其中,`isolation`参数用于指定事务的隔离级别,`rollbackFor`参数用于指定需要回滚的异常类型。
对于`@Transactional(isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)`这个注解,它的作用是将方法设置为使用读已提交的隔离级别,并且在遇到任何异常时都进行回滚。
隔离级别`READ_COMMITTED`表示一个事务只能读取到已经提交的数据,避免了脏读。而`rollbackFor = Exception.class`表示遇到任何异常都会触发事务回滚。
需要注意的是,Spring的事务隔离级别和数据库的事务隔离级别是有关联的。当Spring项目中使用了`@Transactional`注解指定了隔离级别时,会优先使用Spring的隔离级别,而不是数据库的隔离级别。因此,如果两者不一样,以Spring的隔离级别为准。