假设我在类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();
}
}
答案 0 :(得分:2)
你可以这样做:
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 之外,以便您可以在其外部调用其事务回滚。