弹簧和线程:事务

为了能够在我们的线程中使用事务,我们需要了解事务如何在spring中工作。 spring中的事务信息存储在ThreadLocal变量中。 因此,这些变量特定于单个线程上正在进行的事务。

当涉及由单个线程运行的动作时,事务将在分层调用的Spring组件之间传播。

因此,在产生线程的@Transactional带注释的服务的情况下,事务不会从@Transactional服务传播到新创建的线程。 结果将是一个错误,指示缺少事务。

由于在线程内进行的操作需要通过jpa访问数据库,因此必须创建一个新事务。 通过查看@Transactional 文档,我们可以获得有关事务传播类型的更多信息。 @Transactional的默认传播模式为REQUIRED

因此,通过使用@Transactional注释方法,将创建一个新事务并将其传播到从我们的线程调用的其他服务。

例如,我们的async方法可以注释为Transactional

@Async
@Transactional
public void executeTransactionally() {
    System.out.println("Execute a transaction from the new thread");
}

从Runnable类的run函数调用的方法也是如此。 尽管异步的使用非常简单,但是在后台,它会将调用包装在Runnable中,然后将其分派给执行者。

总结一下在Spring使用线程和事务时,应该格外小心。 还请记住,事务不能在线程之间传递。 最后但并非最不重要的一点是,确保@Async和@Transactional函数是公共函数,并通过将在调用之前进行必要操作的代理。

翻译自: https://www.javacodegeeks.com/2017/10/spring-threads-transactions.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值