在更新事务之外执行代码

时间:2014-02-13 08:37:56

标签: seam

我需要在update()上执行两件事:

  • 将实体提交到数据库
  • 通过JMS发送实体

因为对象非常大,所以通过JMS发送必须在数据库事务之外。问题是Seam基于JSF阶段添加了事务,因此一旦我调用了自己的重写update(),数据库事务就已经处于活动状态。

像afterUpdate()这样的回调添加回调会很好但是这似乎不可能。

问题: 如何提交实体,然后在事务外执行代码?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我发现使用的事务是Spring事务。这允许类似的东西:

        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
        @Override
        public void afterCompletion(int status) {
            switch (status) {
                case STATUS_COMMITTED:
                    LOGGER.debug("update::afterCompletion");
                    afterCompletionCallback();
                    break;
                case STATUS_ROLLED_BACK:
                    break;
                case STATUS_UNKNOWN:
                default:
                    break;
            }
        }
    });

该事务仍然可用,但数据库不再被锁定,任何超时都不会影响Seam事务。