mom*_*omo 4 spring hibernate transactions jta java-ee
是否可以在另一个线程中使用事务?
就像传递在线程A中创建的事务然后在同一事务中的线程B中执行一些逻辑一样?
我有两个队列和单独的执行器来处理某些实体类型的填充.
但是,批处理作业正在管理两个人口并等待每个人员完成.这将是不必要的创建两个交易.如果一个失败,理想情况下我希望回滚所有数据,这样就可以将它们作为一个事务运行,并且它可以提供更好的性能.
那么,是否可以创建一个事务,将其传递给另一个线程,在第一个事务的边界内执行一些事情?
我正在使用Spring和Hibernate并且目前正在使用
TransactionTemplate template = new TransactionTemplate( getTransactionManager() );
template.setPropagationBehavior(propagationBehavior);
template.setReadOnly(readOnly);
TransactionStatus status = getTransactionManager().getTransaction(template);
Run Code Online (Sandbox Code Playgroud)
创建一个事务,根本不使用注释,也没有计划这样做.
春天不可能.所有基于事务的代码最终TransactionSynchronizationManager都以ThreadLocals为主,无法将这些值从一个线程复制到另一个线程.
如果您希望能够这样做,您可以使用Spring来获取,DataSource但您必须创建自己的连接并手动创建Hibernate会话.春天PlatformTransactionManager是不可能的.
[编辑]你的案子中有多个主题是什么意思?如果你想并行化工作,那么正确的方法是有N个线程准备应该插入数据库的数据,然后是一个创建1个事务然后完成所有工作的线程.
是的,这意味着您需要在内存中保留大量数据.
如果你真的不想这样做,那么下一个解决方案就是拥有每个线程放置结果的工作表.当两个线程完成时,您启动另一个线程来锁定工作表并运行一些SQL查询以将数据复制到正确的位置.
始终牢记数据库连接,SQL和线程不会混合.数据库是全局状态.如果你同时从几个地方改变全局状态,你将永远面临各种奇怪的问题.尽量避免这种情况.将工作分成许多小的,独立的任务(即当每个任务都有自己的事务时,它们工作得很好).如果你不能这样做,你需要重新考虑你的设计,直到你可以或你不能使用线程.
| 归档时间: |
|
| 查看次数: |
1330 次 |
| 最近记录: |