Jakarta ee 分布式事务中的合法回滚:可能吗?

Jakarta ee 分布式事务中的合法回滚:可能吗?,jakarta-ee,transactions,ejb,websphere,ejb-3.0,Jakarta Ee,Transactions,Ejb,Websphere,Ejb 3.0,我有一个参与全局事务的EJB。 有一部分代码如果失败,我希望显式回滚,尽管我不希望整个事务失败 由于CMT中禁止回滚,我创建了一个BMT并尝试了以下代码: connection.setAutoCommit(false); Savepoint sp= connection.setSavepoint(); try{ //my code editing DB that could possibly fail }catch(SomeException ex){ connection.ro

我有一个参与全局事务的EJB。 有一部分代码如果失败,我希望显式回滚,尽管我不希望整个事务失败

由于CMT中禁止回滚,我创建了一个BMT并尝试了以下代码:

connection.setAutoCommit(false);
Savepoint sp= connection.setSavepoint();
try{
    //my code editing DB that could possibly fail
}catch(SomeException ex){
    connection.rollback(sp);
}
通过这种方式,我只需撤销对本地数据库的修改,但也不会将此失败传播到外部。无论如何,此程序失败,原因如下:

“分布式事务中禁止保存点”


还有其他方法可以解决这个问题吗?

您可以使用第二个EJB来使用CMT,该EJB用
@TransactionAttribute(REQUIRES\u NEW)
注释,您可以将可能失败的代码放在其中。您必须从另一个EJB调用此EJB


容器为代码创建一个新的事务,如果失败,它将回滚。

您可以使用第二个EJB来使用CMT,该EJB带有
@TransactionAttribute(REQUIRES_new)
,您可以将可能失败的代码放在其中。您必须从另一个EJB调用此EJB


容器为代码创建新事务,如果失败,将回滚。

事务上下文不会传播到BTM。您的bean也不会是全局事务的一部分。因此,如果全局事务失败,您的更改仍然可以提交

我不熟悉websphere设置,但我会重新检查连接是否正确。我希望是注入BTM,还是通过CMT传递连接?如果连接设置为支持jta/全局事务,我可以尝试检查容器配置。 或者,在开始使用连接之前,是否启动some
UserTransaction.begin()
? 但是,如果这样做有效,它并不能解决您的问题

适合您的是使用嵌套事务,但JavaEE不支持这些事务。如果Webhere有一些特定于提供商的方式来运行它们(我不知道它的功能)

然后最简单的方法是使用CMT
需要新的
,但它有一个缺点,就是即使全局事务被回滚,也要提交db更改


可能需要一些应用程序设计更改。

事务上下文未传播到BTM。您的bean也不会是全局事务的一部分。因此,如果全局事务失败,您的更改仍然可以提交

我不熟悉websphere设置,但我会重新检查连接是否正确。我希望是注入BTM,还是通过CMT传递连接?如果连接设置为支持jta/全局事务,我可以尝试检查容器配置。 或者,在开始使用连接之前,是否启动some
UserTransaction.begin()
? 但是,如果这样做有效,它并不能解决您的问题

适合您的是使用嵌套事务,但JavaEE不支持这些事务。如果Webhere有一些特定于提供商的方式来运行它们(我不知道它的功能)

然后最简单的方法是使用CMT
需要新的
,但它有一个缺点,就是即使全局事务被回滚,也要提交db更改


可能需要对应用程序设计进行一些更改。

如果新事务有效,它也将提交。请注意,新事务独立于第一个事务,如果有什么东西使第一个事务回滚(出于另一个原因),则新事务仍将提交。如果新事务有效,它也将提交。请注意,新事务独立于第一个事务,如果有什么东西使第一个事务回滚(出于另一个原因),那么新事务仍将提交。