春季全球交易

时间:2012-06-06 11:29:24

标签: java spring transactions

如果事务产生多个线程,是否有办法在Spring中模仿全局事务。我知道在春天真的不可能,但是想到也许有一些解决方法。

2 个答案:

答案 0 :(得分:0)

Spring不提供事务支持;它只是与现有机制(JTA,本地交易,模拟交易)联系在一起。因此,您将受到您正在使用的任何基础交易的支配。

如果您在应用程序服务器中,其中一些允许在容器内执行并行处理。容器管理的线程池的优点是可以将容器资源(JNDI上下文,事务等)传播到其他线程。

例如,WebSphere和WebLogic使用WorkManager API:http://www.devx.com/Java/Article/28815/0 虽然我似乎记得Java EE 6现在支持线程池(但不确定这一点)。

答案 1 :(得分:0)

通常,事务和其他上下文按容器保存在ThreadLocal中,并且在线程执行期间可用于每个方法。如果您将使用WorkManager API,则需要检查您的供应商是否支持将事务上下文传播到异步作业(规范from what I recall不需要它)。

另一种选择可能是查看Spring的custom bean scopes - 您可以尝试为您的操作实现自定义范围并在那里存储Transactional上下文。但这可能不是微不足道的。

更一般地说,将事务范围传播到异步线程听起来并不合适 - 通常异步操作要么是CPU密集型的,要么是长期存在的,并且可能无需事务就可以更好地重新实现。