当前位置: 首页 > 面试题库 >

如何设计全局分布式事务(无数据库)?JTA可以用于无数据库事务吗?

韩明德
2023-03-14
问题内容

我认为这是一个相当普遍的问题:如何将我的业务逻辑放在分布式系统环境中的全局事务中?举一个例子,我有一个TaskA包含几个子任务:

TaskA {subtask1,subtask2,subtask3 …}

这些子任务中的每一个都可以在本地计算机或远程计算机上执行,我希望TaskA通过事务以原子方式(成功或失败)执行。每个子任务都具有回滚功能,一旦TaskA认为操作失败(因为子任务之一失败),它将调用子任务的每个回滚功能。否则,TaskA将提交整个事务。

为此,我遵循“审计试用”事务模式为每个子任务都有一个记录,因此TaskA可以知道子任务的操作结果,然后决定回滚或提交。这听起来很简单,但是,难点在于如何将每个子任务与全局事务相关联?

TaskA开始时,它将启动一个全局事务,该事务关于哪个子任务什么都不知道。为了使子任务意识到这一点,我必须将事务上下文传递给子任务的每次调用。真是可怕!我的子任务可以在新线程中执行,也可以通过AMQP代理发送消息在远程中执行,这很难巩固上下文传播的方式。

我做了一些研究,例如“事务模式-
四个与事务相关的模式的集合”,“在异步消息传递环境中检查事务”,这些都不能解决我的问题。他们要么没有实际的例子,要么没有解决上下文传播问题。

我想知道人们如何解决这个问题?因为这种交易必须在企业软件中很常见。

X / Open
XA只是解决方案吗?JTA可以在这里提供帮助吗(我没有研究JTA​​,因为大多数东西都与数据库事务有关,并且我正在使用Spring,我不想在我的软件中使用其他Java
EE应用服务器)。

可以和我分享一些想法吗?谢谢。

结论

Arjan和Martin给出了非常好的答案,谢谢。 最终,我没有采用这种方式。经过更多研究,我选择了另一个模式“ CheckPoint
1。

查看我的需求后,我发现“审核试用事务模式”的目的是要知道操作已进行到哪个级别,如果失败了,我可以在重新加载某些上下文后在失败的地方重新启动它。实际上这不是事务,失败后没有回滚其他成功步骤。这是CheckPoint模式的本质。但是,研究分布式事务的东西使我学到了很多有趣的东西。除了Arjan和Martin提到的内容。我还建议深入研究此领域的人们看看CORBA,它是分布式系统的著名协议。


问题答案:

没错,由于JTA API提供了XA事务管理器,因此需要两阶段提交支持。

据我所知,Spring本身并不提供事务管理器实现。该JtaTransactionManager中唯一的代表,以通常的JavaEE实现提供现有的实现。

因此,您必须将JTA实现插入Spring才能完成有效的工作。以下是一些建议:

  • JOTM
  • 基于Arjuna的JBossTS。
  • 阿托基莫斯

然后,您将必须实现资源管理器以支持两阶段提交。在JavaEE世界中,它包含一个打包为RAR存档的资源适配器。根据资源的类型,以下方面需要读取/实现:

  • XAResource接口
  • JCA Java Connector Architecture主要是在涉及远程连接的情况下
  • 如果需要在节点之间传播事务,则使用JTS事务服务

作为示例,我建议您查看经典的“与文件进行交易”问题的实现:

  • JBoss Transactions中的事务文件管理器
  • XADisk项目


 类似资料:
  • 一、Attach数据库: ATTACH DATABASE语句添加另外一个数据库文件到当前的连接中,如果文件名为":memory:",我们可以将其视为内存数据库,内存数据库无法持久化到磁盘文件上。如果操作Attached数据库中的表,则需要在表名前加数据库名,如dbname.table_name。最后需要说明的是,如果一个事务包含多个Attached数据库操作,那么该事务仍然是原子的。见如下示例:

  • 假设我们有两个服务,A和B。服务A有一个函数执行以下操作: 验证数据 现在,让我们假设以下步骤之一,步骤3或4失败。由于服务B对数据库进行了更改,这些更改仍然存在。 在这种情况下,有没有办法回滚数据库?我曾考虑过数据库事务,但在nest js中找不到任何方法来实现这一点,尽管TypeOrm支持它,但nest看起来并不自然。如果不是的话,我现在被服务B所做的更改“卡住”了,但是如果没有服务B所做的更

  • 我一直试图运行事务方法,但它无法在firebase数据库中获取和设置正确的数据。 代码如下:

  • 事务的特性 所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。 Atomicity(原子性) 原子性是指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。 Consistency(一致性) 一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。 Isolati

  • Spring Boot通过使用Atomikos或Bitronix嵌入式事务管理器支持跨多个XA资源的分布式JTA事务。 部署到合适的Java EE Application Server时,也支持JTA事务。 检测到JTA环境时,Spring的JtaTransactionManager用于管理事务。 自动配置的JMS,DataSource和JPA bean已升级为支持XA事务。 您可以使用标准的Sp

  • 数 据库(或者系统)事务的声明总是必须的。在数据库事务之外,就无法和数据库通讯(这可能会让那些习惯于自动提交事务模式的开发人员感到迷惑)。永远使用清 晰的事务声明,即使只读操作也是如此。进行 显式的事务声明并不总是需要的,这取决于你的事务隔离级别和数据库的能力,但不管怎么说,声明事务总归有益无害。当然,一个单独的数据库事务总是比很多琐 碎的事务性能更好,即时对读数据而言也是一样。 一 个 Hibe