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

时间:2013-02-25 11:30:09

标签: java sybase-ase distributed-transactions

我们有一个外部网络服务,它暴露了一些API lockunlock。以下是在我们的系统中保存值时遵循的步骤。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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