如何管理 Web 服务调用和数据库之间的分布式事务协调?

Posted

技术标签:

【中文标题】如何管理 Web 服务调用和数据库之间的分布式事务协调?【英文标题】:How to manage distributed transaction co-ordination between webservice calls and database? 【发布时间】:2013-02-25 11:30:08 【问题描述】:

我们有一个外部 Web 服务,它公开了几个 API lockunlock。以下是在我们的系统中保存值时遵循的步骤。

try 
  call lock
  save changes in single DB transaction
catch user_defined_exception
  call unlock

如果有任何事务超时,我们将不会调用unlock,因为此超时异常不被视为用户定义异常的一部分。同样在将来,可能会引入任何新的异常,我们不想包括所有这些异常并进行解锁。 我们正在寻找任何工业标准/模式来在服务和数据库事务之间进行事务协调。 我们的应用程序是在java 中构建的,数据库是Sybase ASE。 非常感谢任何提示。

【问题讨论】:

Sybase 是一家公司,而不是数据库。您指的是哪个 Sybase 产品(ASE、ASA、IQ)? @MichaelGardner 更新了我的问题。感谢您的指正。 【参考方案1】:

在 Java 中用于正确锁定异常的 recommended practice 如下:

lock();
try 
  doStuff();
 finally 
  unlock();

这确保无论抛出(或不抛出)什么异常都会释放锁,而无需捕获或重新抛出它。但是,在您的情况下,这可能仍然不是最安全的做法,因为 unlock() 是一个远程调用,它本身会引发异常。

服务和数据库之间协调的标准是WS-AT。任何 Java 应用程序服务器都应该支持它,与 JTA 桥接,并在数据库本身上进行两阶段提交。在应用服务器中配置数据库连接时,请确保选择 XADataSource 选项。

【讨论】:

实际上,我希望只有在出现任何异常时才会解锁。但是您的伪代码将解锁,尽管根本没有例外。我将尝试探讨您对 WS-AT 的建议。

以上是关于如何管理 Web 服务调用和数据库之间的分布式事务协调?的主要内容,如果未能解决你的问题,请参考以下文章

求救,分布式事务怎么处理

微服务中的事务管理

让您轻松理解分布式事务产生的场景

RabbitMQ,RocketMQ,Kafka 事务性,消息丢失和重复发送处理策略

调用dubbo服务时事务配置在哪

如何归档 java 和 c++ 应用程序之间的分布式(数据库)事务?