0

我所做的

我有一个async系统,每当在系统中创建新实体时都会做出反应,main并且该async系统会在数据库中查询新创建的实体。


我是怎么做的

async我使用的系统创建消息hibernate interceptor

因此,每当创建一个新实体时onSave,都会调用拦截器的方法,并且我

将实体 id 保存在 alist中,现在afterTransactionComplete(Transaction tx)是什么时候

调用时,我使用消息传递系统(ActiveMq)刷新系统中entity id的所有内容。listasync


问题是什么

现在problem,当有一个以上的交易正在进行时,就会出现这种情况......并且两者都有

交易创建实体。

让我举个例子:

Tx_A创建实体EA1, EA2

Tx_B创建实体EB1, EB2

现在假设执行流程是这样发生的:

[1] onSave 为 EA1,我将 EA1 id 添加到 flushList

[2] onSave 为 EB1,我将 EB1 id 添加到 flushList

[3] 用于 Tx_A 的 afterTransactionComplete(tx)

现在,我将在查询数据库时将EA1 and EB1id 刷新到async系统

因为交易仍未完成,所以 EB1发现 null 。Tx_B


现在这个问题可以解决,如果在onsave调用中我可以获取事务 id,然后afterTransactionCompletion我可以只刷新与该事务相关的实体

[1] 现在有没有办法获得这个交易ID?

[2] 对于上述问题,还有其他解决方案吗?

我正在使用休眠 4.2.2

4

1 回答 1

0

只有当我们使用全局范围拦截器时才会出现问题。

如果我们使用会话范围拦截器,那么每个新事务都有一个新的拦截器是没有问题的。

于 2014-04-01T08:27:29.320 回答