事务
声明式事务管理
简单易操作的方式就是直接所需要被事务管理的方法添加@Transactional,并且在主方法中添加@EnableTransactionManagement来开启全局事务管理
@SpringBootApplication
@EnableTransactionManagement // 开始事务,新版的不需要添加该注解(笔者没有试过)
public class BucketApplication {
public static void main(String[] args) {
SpringApplication.run(BucketApplication.class, args);
}
}
@Transactional
public void updateInfo(Info info){
// 涉及一些update/delete操作,如果异常需要回滚.
}
注意有一些方式会导致事务不回滚(这里先只记录一种,还有其他方式有空再来添加)
- 在加了
@Transactional的方法里面,请小心使用try catch
@Transactional
public void updateInfo(Info info) {
try {
int i = 1/0;
} catch (Exception e) {
// 抓住了异常,但是没有抛出的话,是感知不到有异常发生的,必须要抛出
log.error(e.getMessage(),e);
throw new RuntimeException("Something went wrong");
}
}
编程式事务管理
使用SpringBoot中的template模板类来进行操作
@Autowired
private TransactionTemplate transactionTemplate;
public void updateInfo(Info info) {
transactionTemplate.execute(status -> {
try {
// do something
}catch (Exception e){
log.error("error info ==> {}",e.getMessage());
status.setRollbackOnly(); // 使用了catch 需要手动回滚.如果不适用try catch 就不用手动回滚.
return false;
}
return true;
});
}