mfc 弹簧
为了能够在我们的线程中使用事务,我们需要了解事务如何在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
mfc 弹簧