C# 在nHibernate中管理嵌套事务
假设我在类C中有一个名为a()、B()和mainFunction()的方法。在mainFunction()中,我必须运行两个方法a()和B(),但都有beginTransaction()和commitTransaction()。如果B()中发生任何错误,那么A()中的事务是否仍将提交?如果是,我如何解决这个问题?提前谢谢C# 在nHibernate中管理嵌套事务,c#,nhibernate,C#,Nhibernate,假设我在类C中有一个名为a()、B()和mainFunction()的方法。在mainFunction()中,我必须运行两个方法a()和B(),但都有beginTransaction()和commitTransaction()。如果B()中发生任何错误,那么A()中的事务是否仍将提交?如果是,我如何解决这个问题?提前谢谢 public class C { public void A() { //beginTransaction
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作为main函数的全局变量。然后,如果它在函数A
或函数B
上捕获到错误,则可以回滚事务,而不保存对数据库的任何更改
当然,您可以在函数A或函数B中使用ISession.execute
或ISession.Update
,而不保存对数据库的任何更改,除非调用提交事务
这里的想法是将事务放在所有函数A和B的外部,这样您就可以在其外部调用其事务回滚。对不起,先生,但我必须将begin和commit放在每个函数中,并执行嵌套事务。我想我可以重写nHibernate的beginTransaction()和commitTransaction(),以实现计数器并检查它是否是最后一个commitTransaction。如果是,则只提交整个事务。但是要覆盖哪个类呢?我很困惑,我明白了。但是如果函数B触发错误,您也要回滚它吗?那么为什么不让它全球化呢?但这只是我的建议。你能看一下这个dataAccessLayer吗。有很多传统的错误,但我想让你看看这三种方法,并建议我?NHibernate不支持嵌套事务。您需要了解nhibernate的工作单元概念。事务不应在函数内部随意启动。事务应在工作单元内启动。可能重复