由于调用onSave和afterTransactionComplete的时间差异,hibernate拦截器用于审计日志设计问题

时间:2014-03-29 10:34:28

标签: java hibernate transactions interceptor audit-logging

我做什么

我有一个async系统,只要在main系统中创建新实体,该async系统就会为数据库查询新创建的实体。


我是怎么做的

要为async系统创建消息,请使用hibernate interceptor

因此,无论何时创建新实体,都会调用拦截器的onSave方法,并且

将实体ID保存在list中,现在afterTransactionComplete(Transaction tx)

时保存

调用,我使用消息传递系统(ActiveMq)刷新entity idlist系统中的所有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

1 个答案:

答案 0 :(得分:0)

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

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