@Transactional(rollbackFor = Exception.class) 回滚SQL异常
时间: 2023-12-05 09:41:26 浏览: 27
在使用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异常时,事务会自动回滚。
相关问题
springboot项目 添加 @Transactional(rollbackFor = Exception.class) 注解 抛出异常后sqlserver数据库不进行回滚
可能是因为你的数据库驱动不支持自动提交事务,需要手动提交事务。可以在方法结束前手动提交事务,例如:
```
@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 回滚批量插入
在使用 @Transactional 注解做事务管理时,如果在一个事务中执行了批量插入操作,可以通过设置事务的回滚策略来实现回滚。在 Spring 中,可以使用 `TransactionTemplate` 或者 `PlatformTransactionManager` 来进行事务管理和回滚操作。
具体实现可以参考以下步骤:
1. 在 Spring 中配置事务管理器,例如使用 `DataSourceTransactionManager`。
2. 在代码中使用 `@Transactional` 注解标注需要进行事务管理的方法。
3. 在方法中进行批量插入操作,如果出现异常,事务管理器会自动回滚事务。
例如:
```java
@Service
public class UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Transactional(rollbackFor = Exception.class)
public void batchInsert(List<User> userList) throws Exception {
String sql = "INSERT INTO user (name, age) VALUES (?, ?)";
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
User user = userList.get(i);
ps.setString(1, user.getName());
ps.setInt(2, user.getAge());
}
@Override
public int getBatchSize() {
return userList.size();
}
});
}
}
```
在上面的例子中,我们使用 `@Transactional` 注解标注了 `batchInsert` 方法,并设置了回滚策略为所有异常都回滚。如果在执行批量插入操作时出现异常,事务管理器会自动回滚事务。