在保存、更新或删除时,如何确保NHibernate在事务中?

在保存、更新或删除时,如何确保NHibernate在事务中?,nhibernate,transactions,Nhibernate,Transactions,我想确保,当我使用将任何数据持久化到数据库时,操作是在事务中执行的。有没有办法通过拦截器检查事务是否处于活动状态?或者任何其他事件机制 更具体地说,我正在使用System.Transaction.TransactionScope进行事务管理,只是想阻止自己不使用它。为了什么?如果您没有在事务内执行,将向您发出警告。通常情况下,您应该打开此工具进行开发…目的是什么?如果您没有在事务内执行,将向您发出警告。通常,您应该打开此工具进行开发…我还没有尝试过此方法,但我认为您可以创建一个实现IFlushE

我想确保,当我使用将任何数据持久化到数据库时,操作是在事务中执行的。有没有办法通过拦截器检查事务是否处于活动状态?或者任何其他事件机制


更具体地说,我正在使用
System.Transaction.TransactionScope
进行事务管理,只是想阻止自己不使用它。

为了什么?如果您没有在事务内执行,将向您发出警告。通常情况下,您应该打开此工具进行开发…

目的是什么?如果您没有在事务内执行,将向您发出警告。通常,您应该打开此工具进行开发…

我还没有尝试过此方法,但我认为您可以创建一个实现
IFlushEventListener
的侦听器。比如:

    public void OnFlush(FlushEvent @event)
    {
        if (!@event.Session.Transaction.IsActive)
        {
            throw new Exception("Flushing session without an active transaction!");
        }
    }

我不清楚OnFlush的确切调用时间(谷歌也没有帮助)。也可能有一个隐式事务可以将IsActive设置为true。

我还没有尝试过这一点,但我认为您可以创建一个实现
IFlushEventListener的侦听器。
。比如:

    public void OnFlush(FlushEvent @event)
    {
        if (!@event.Session.Transaction.IsActive)
        {
            throw new Exception("Flushing session without an active transaction!");
        }
    }

我不清楚OnFlush的确切调用时间(谷歌也没有帮助)。也可能有一个隐式事务可以将IsActive设置为true。

如果在构建会话的代码中有一个位置,则可以在该位置启动事务并一次解决问题。

如果在构建会话的代码中有一个位置,您可以在那里启动事务并立即解决问题。

如果您一直使用Spring.Net进行事务处理,您可以使用匿名内部对象来确保DAOs/ServiceLayer对象始终公开其服务方法周围的TransactionAdvice。
请参阅以获取示例。

如果您一直在使用Spring.Net进行事务处理,则可以使用匿名内部对象来确保DAOs/ServiceLayer对象始终公开其服务方法周围的TransactionAdvice。
参见示例。

已经忘记了NHProf,但我正在这里寻找一个编程解决方案。NHProf不会总是开放的,也不会总是在每个人的机器上。事实上,NHProf可以检测到它,这表明它可以做到,我只是想知道如何做到。我已经忘记了NHProf,但我在这里寻找一个编程解决方案。NHProf不会总是开放的,也不会总是在每个人的机器上。NHProf能够检测到它的事实表明它可以做到,我只是想知道如何做到。在会话Flush()方法期间调用所有IFlushEventListeners:在会话Flush()方法期间调用所有IFlushEventListeners:不是真的。我真的不想控制那里的事务(更多的是在更新/插入时),因为我不想在选择上产生事务开销(这是将要完成的大部分工作。为什么不希望在selects上显示事务?它们也需要隔离。除非我弄错了,否则事务是确保数据一致性的一种手段。因为selects不会更改数据,而且大多数时候我只是读取信息以便在页面/屏幕上显示,所以我会这样做不需要transactionscope。同意,如果我同时更新和读取数据,则selects很可能存在于同一事务中,但一般来说,对于仅选择的场景,我不希望或不需要设置显式事务的开销。当选择多个数据时,会出现问题。另一个事务可以n在连续读取之间进行干预,并使两次读取彼此不一致。将每个“工作单元”从头到尾包装在一个事务中被认为是最佳做法。否则,每个语句都在其自己的隐式事务中运行。这肯定没有更高的效率!公平的要求,我没有这样认为。经过反思无论如何,这可能是最简单的方法。感谢您的输入。詹姆斯。不太想。我不想控制那里的事务(更多的是更新/插入),因为我不想在选择上增加事务的开销(这是将要完成的大部分工作。为什么不希望在selects上显示事务?它们也需要隔离。除非我弄错了,否则事务是确保数据一致性的一种手段。因为selects不会更改数据,而且大多数时候我只是读取信息以便在页面/屏幕上显示,所以我会这样做不需要transactionscope。同意,如果我同时更新和读取数据,则selects很可能存在于同一事务中,但一般来说,对于仅选择的场景,我不希望或不需要设置显式事务的开销。当选择多个数据时,会出现问题。另一个事务可以n在连续读取之间进行干预,并使两次读取彼此不一致。将每个“工作单元”从头到尾包装在一个事务中被认为是最佳做法。否则,每个语句都在其自己的隐式事务中运行。这肯定没有更高的效率!公平的要求,我没有这样认为。经过反思这可能是最简单的方法。谢谢你的意见。