SpringBoot 中事务的使用

77 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 23 天,点击查看活动详情


SpringBoot 中事务的使用

事务是恢复和并发控制的基本单位,具有ACID特性。

声明式事务:注解@Transactional

对于使用了 @Transactional 注解的方法,如果执行出错,就会回滚整个函数方法。

  • 作用于类:当把@Transactional 注解放在类上时,表示所有该类的public方法都配置相同的事务属性信息。

  • 作用于方法:当类配置了@Transactional,方法也配置了@Transactional,方法的事务会覆盖类的事务配置信息。

使用注解事务的粒度过大,如果只想对某一个代码块使用事务,则可以使用 TransactionTempale 来解决。

编程式事务:TransactionTempale

使用TransactionTemplate 不需要显式地开始事务,甚至不需要显式地提交事务。这些步骤都由模板完成。

TransactionTemplate 的execute 方法接收一个TransactionCallback 实例。TransactionCallback 包含如下方法。

Object dolnTransaction(TransactionStatus status) 。

该方法的方法体就是事务的执行体。

如果事务的执行体没有返回值,则可以使用TransactionCallbackWithoutResultl类的实例。这是个抽象类,不能直接实例化,只能用于创建匿名内部类。它也是TransactionCallback 接口的子接口,该抽象类包含一个抽象方法:

void dolnTransactionWithoutResult(TransactionStatus status)

该方法与dolnTransaction 的效果非常相似,区别在于该方法没有返回值,即事务执行体无须返回值。

@Autowired
TransactionTemplate transactionTemplate;

transactionTemplate.execute(new TransactionCallback<Object>() {     
    @Override 
    public Object doInTransaction(TransactionStatus transactionStatus) { 
        //...         
        return Boolean.TRUE;     
    } 
});

transactionTemplate.execute(new TransactionCallbackWithoutResult() { 
    @Override
    protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
        //...     
    } 
});

如果你发现了文章出现了错误或有不足,欢迎在评论区和我交流,我看到了一定会回复。

写文章不易,如果你觉得文章对你有帮助,麻烦点一下点赞、收藏,你的支持是我写文章的最大动力!