我们有一个外部网络服务,它暴露了一些API lock
和unlock
。以下是在我们的系统中保存值时遵循的步骤。
try
call lock
save changes in single DB transaction
catch user_defined_exception
call unlock
如果存在任何事务超时,我们将不会调用unlock
,因为此超时异常不被视为用户定义的异常的一部分。同样在将来,可能会引入任何新的异常,我们不希望包含所有这些异常并解锁。
我们正在寻找任何工业标准/模式来在服务和数据库事务之间进行事务协调。
我们的应用程序内置于java
,数据库为Sybase ASE
。
任何提示都非常感谢。
答案 0 :(得分:1)
用于在Java中使用异常进行正确锁定的recommended practice如下:
lock();
try {
doStuff();
} finally {
unlock();
}
这确保无论抛出(或不抛出)异常都会释放锁,而无需捕获或重新抛出它。但是,在您的情况下,这可能仍然不是最安全的事情,因为unlock()
是一个远程调用,并且本身可以抛出异常。
服务和数据库之间的协调标准是WS-AT。任何Java应用程序服务器都应该支持它,与JTA桥接,以及对数据库本身进行两阶段提交。在应用程序服务器中配置数据库连接时,请确保选择XADataSource选项。