对于
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块?
类似于在范围退出时自动调用函数的方法会对我有所帮助.