【发布时间】:2011-10-27 14:26:28
【问题描述】:
对于 mysql 连接,我有一个连接对象并使用事务机制 connection.startTransaction()、connection.commitTransaction()、connection.rollbackTransaction()。
对于每个startTransaction(),必须始终调用commitTransaction() 或rollbackTransaction()。错过这样一个电话或同时拨打这两个电话会破坏我的交易系统。
所以我按以下方式使用它们:
boolean i_am_in_a_transaction=true;
try {
connection.startTransaction();
...
i_am_in_a_transaction=false;
connection.commitTransaction();
} finally {
if(i_am_in_a_transaction) {
connection.rollbackTransaction();
}
}
这确保了声明的调用顺序,但它很费力,因为我必须在使用事务的任何地方都写这行。
在 C++ 中,如果调用了 commit() 函数,我将使用一个事务对象检查其析构函数,否则调用 rollback():
class Transaction {
public:
Transaction()
:am_in_transaction(false) {
}
~Transaction() {
if(_am_in_transaction) {
rollback();
}
}
void startTransaction() {
_am_in_transaction=true;
...start Transaction...
}
void commit() {
_am_in_transaction=false;
...commit Transaction...
}
void rollback() {
_am_in_transaction=false;
...rollback Transaction...
}
private:
bool _am_in_transaction;
}
这样我就可以在一个地方实现逻辑并且可以非常简单地使用它:
Transaction my_transaction;
my_transaction.startTransaction;
...
my_transaction.commit();
这段代码比上面带有 try/finally 块的 java 代码要简单得多。
有没有办法在 java 中实现这种行为,而无需将逻辑专用于调用者并让他实现 try/finally 块?
在范围退出时自动调用函数之类的方法会对我有所帮助。
【问题讨论】:
-
@sgusc Java 7 会自动关闭资源但不会自动调用未知函数
-
@JohnVint 是的,好点。我忘记了
using的语义。我把它等同于我脑海中 Python 的with语句。感谢您的澄清!