1

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

4

2 回答 2

0

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

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

更一般地说,需要将事务范围传播到异步线程听起来是不对的——通常异步操作要么是 CPU 密集型的,要么是长期存在的,也许可以在不需要事务的情况下更好地重新实现。

于 2012-06-06T18:55:28.090 回答
0

Spring 不提供事务支持;它仅与现有机制(JTA、本地事务、模拟事务)相关联。因此,您受制于所使用的任何基础交易。

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

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

于 2012-06-06T17:31:17.227 回答