假设我在类C中有一个名为A(),B()和mainFunction()的方法。在mainFunction()中,我必须同时运行方法A()和B(),但两者都有beginTransaction()和commitTransaction()。如果 B() 中发生任何错误,那么 A() 中的事务是否仍将提交?如果是,我怎样才能摆脱这个问题?提前致谢
public class C
{
public void A()
{
//beginTransaction
//functions
//commitTransaction
}
public void B()
{
//beginTransaction
//functions
//commitTransaction
}
public void mainFunction()
{
A();
B();
}
}
你可以这样做:
public void A(ISession objSession)
{
//functions
}
public void B(ISession objSession)
{
//functions
}
public void mainFunction()
{
ISession objSession = base.GetCurrentSession;
using (ITransaction transaction = objSession.BeginTransaction)
{
try
{
A(objSession);
B(objSession);
//If successful for everything:
objSession.Flush();
objSession.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
}
}
基本上,我将ISession作为mainFunction的全局变量。然后,如果它在 Function A
或 Function B
上捕获错误,则可以回滚事务而不在数据库上保存任何更改。
当然,您可以在函数 A 或函数 B 中使用 ISession.Evict
或 ISession.Update
,而无需在数据库上保存任何更改,除非您调用提交事务。
这里的想法是将事务放在所有函数 A 和 B 之外,以便可以在它之外调用其事务回滚。