Java 在回滚中间写入数据库日志

Java 在回滚中间写入数据库日志,java,transactions,jboss,jakarta-ee,ejb-3.0,Java,Transactions,Jboss,Jakarta Ee,Ejb 3.0,我正在使用jboss5.1.x和ejb3.0 我有一笔交易是这样的: MDB侦听JMS队列。 MDB从JMS向数据库写入消息 在一些catch子句中,我抛出“newejbexception(..”,以便在发生特定异常时进行回滚 除此之外,我还配置了一个重试机制,在消息进入错误队列3次之后 我想要实现的是: 当我回滚时,我想增加当前重试次数,因此如果有人观察数据库,他/她可以在线查看当前重试次数 问题是:当我回滚时,甚至“insert\u number\u of\u retry”查询本身也在回滚,

我正在使用jboss5.1.x和ejb3.0

我有一笔交易是这样的: MDB侦听JMS队列。 MDB从JMS向数据库写入消息

在一些catch子句中,我抛出“newejbexception(..”,以便在发生特定异常时进行回滚

除此之外,我还配置了一个重试机制,在消息进入错误队列3次之后

我想要实现的是:

当我回滚时,我想增加当前重试次数,因此如果有人观察数据库,他/她可以在线查看当前重试次数

问题是:当我回滚时,甚至“insert\u number\u of\u retry”查询本身也在回滚,这使我无法将当前的重试次数添加到数据库中

我怎样才能解决这个问题

谢谢


ray。

您需要在单独的线程中进行单独的事务处理(如果需要,您可以使用专用线程/池或生成一个)。您可以选择等待forked tx结束或失效(只需通过回滚和快速退出继续),这取决于额外的逻辑,因此。

您可以尝试在单独的事务中执行日志记录方法,方法是使用
@TransactionAttribute(TransactionAttributeType.REQUIRES\u NEW)对其进行注释

不受支持也会起作用。除了在我尝试@TransactionAttribute(TransactionAttribute.REQUIRES\u NEW)的任何事务中都不会执行之外,它不起作用。该操作也已回滚。如果在单独的线程中进行包装,则这无关紧要,因为该线程本身实际上启动了一个新事务。为什么我必须在单独的线程中进行包装?这对我来说很奇怪。我可能会稍后再试,从永远都没有做过任何EJB,而是修复了jboss使用的事务管理器(arjuna)[它有线程泄漏]。还有一点:不要在同一个实体中使用重试计数器,您需要一个单独的实体,带有计数器和ref(以及导致重试的初始请求的可选ID集合)。