事务

39 阅读1分钟

事务

声明式事务管理

简单易操作的方式就是直接所需要被事务管理的方法添加@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;
    });
}