是否可以在JTA(Atomikos)中设置并行事务

发布于 2024-12-09 17:18:27 字数 231 浏览 0 评论 0原文

我有两个事务资源:数据库和消息队列。所以我使用 Atomikos 作为 XA 事务管理器。

在交易(tx1)内,是否可以并行打开另一个单独的交易(tx2)?

在tx2中,它会将一些数据提交到db中,即使tx1最终也可能失败并回滚。

并且 tx2 必须在 tx1 内部完成,就好像 tx2 中发生错误一样,也应该回滚 tx1。

有人知道我怎样才能实现这一目标吗?

谢谢。

I have two transactional resources, database and message queue. So I use Atomikos as the XA transaction manager.

Inside a transaction (tx1), is it possible to open another separated transaction (tx2) in parallel?

In tx2, it will commit some data into db, even the tx1 might be failed and roll backed eventually.

And tx2 must be done inside tx1, as if error occurred in tx2 should roll back the tx1 also.

Anyone knows how I can achieve this?

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

偏爱自由 2024-12-16 17:18:27

是的,您可以实现这一目标。你谈论所谓的“嵌套”交易
首先,对于 Atomikis,您必须指定属性 com.atomikos.icatch.serial_jta_transactions=false

如果您直接使用 TransactionManager 进行操作,则必须在开始 tx2 之前暂停 tx1 (TransactionManager.suspend())。提交事务 tx2 后,您必须恢复 tx1。如果执行 tx2 时出现错误,您必须回滚 tx2、恢复 tx1 并回滚 tx1:

示例

TransactionManager tm=...

tm.begin();
Transaction tx1 = tm.getTransaction();
//do somethins in tx1;
tm.suspend(tx1);
tm.begin();
Transaction tx2 = tm.getTransaction();

try{
  //do something in tx2
  tm.commit() ;// try to commit tx2
}cath(Throwable e){
   tx2.rollback();
   tm.resume(tx1)
   tx1.rollback();
   tx1 = null;
}

if(tx1!=null){
  tm.resume(tx1);
  tm.commit();
}

Yes, you can achive this. You talk about so named "nested" transaction
First of all for Atomikis you must specify property com.atomikos.icatch.serial_jta_transactions=false

If you operate with TransactionManager directly you have to suspend tx1 before begining tx2 (TransactionManager.suspend()). After commiting transaction tx2 you have to resume tx1. And if there is an error while execution tx2 you must do rollback tx2, resume tx1 and rollback tx1:

Example

TransactionManager tm=...

tm.begin();
Transaction tx1 = tm.getTransaction();
//do somethins in tx1;
tm.suspend(tx1);
tm.begin();
Transaction tx2 = tm.getTransaction();

try{
  //do something in tx2
  tm.commit() ;// try to commit tx2
}cath(Throwable e){
   tx2.rollback();
   tm.resume(tx1)
   tx1.rollback();
   tx1 = null;
}

if(tx1!=null){
  tm.resume(tx1);
  tm.commit();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文