我有一个async
系统,只要在main
系统中创建新实体,该async
系统就会为数据库查询新创建的实体。
要为async
系统创建消息,请使用hibernate interceptor
。
因此,无论何时创建新实体,都会调用拦截器的onSave
方法,并且
将实体ID保存在list
中,现在afterTransactionComplete(Transaction tx)
调用,我使用消息传递系统(ActiveMq)刷新entity id
到list
系统中的所有async
。
现在,当有多个交易正在进行时,problem
出现了......两者都是
交易创建实体。
让我举一个例子:
Tx_A
创建实体EA1, EA2
。
Tx_B
创建实体EB1, EB2
。
现在让我们说执行流程是这样发生的:
[1] onSave for EA1,我将EA1 id添加到flushList
[2] onSave for EB1,我将EB1 id添加到flushList
[3]在Tx_A
的事务完成(tx)之后现在,此时我会将EA1 and EB1
id刷新到async
系统,当查询数据库时
为EB1
找到null,因为事务Tx_B
仍未完成。
现在这个问题可以解决,如果在onsave
调用中我可以获得交易ID,然后在afterTransactionCompletion
我只能刷新与该交易相关的实体
[1]现在有办法获得此交易ID吗?
[2]上述问题还有其他解决办法吗?
我正在使用hibernate 4.2.2
答案 0 :(得分:0)
只有在我们使用全局范围拦截器时才会出现问题。
如果我们使用会话范围拦截器那么就没有问题,因为每个新事务都有一个新的拦截器。