Nhibernate 禁止在事务之外更改对象
我们最近无意中发现了一种NHibernate的行为,它让我们非常头痛;) 让我们看一下以下示例:Nhibernate 禁止在事务之外更改对象,nhibernate,transactions,Nhibernate,Transactions,我们最近无意中发现了一种NHibernate的行为,它让我们非常头痛;) 让我们看一下以下示例: declare x open transaction create and persist object x commit transaction change object x open other transaction do nothing close transaction 令我们吃惊的是,在提交到数据库的第二个事务之外对“x”所做的更改(尽管在我考虑过之后,这种行为对我来说也
declare x
open transaction
create and persist object x
commit transaction
change object x
open other transaction
do nothing
close transaction
令我们吃惊的是,在提交到数据库的第二个事务之外对“x”所做的更改(尽管在我考虑过之后,这种行为对我来说也是有意义的)。在我们的架构中,这是一个问题,因此我们习惯了来自世界的不同行为;)
现在问题是:
感谢您的想法,BaSche对象x不会在事务之外更改,因为当您打开会话时,您创建的事务并不明确。当您调用transaction.Commit()或关闭会话时,它已完成session.Flush(),并且您的所有更改都已保存。我将回答您的问题否、否和否。当然,任何事情都是可能的,例如,您可以使用INotifyPropertyChanged执行一些丑陋的操作,如果没有事务,则引发异常。但NHibernate并不是为满足您的需求而设计的
NHibernate的设计目的是让您的对象不知道持久性层,并且它在这些方面取得了很大的成功(除了一些值得注意的例外,比如需要虚拟机进行延迟加载)。NHibernate事务应用于将对象状态与数据库同步,而不是与对象本身的更改同步。此外,如果事务中止,您必须能够回滚对对象的更改,这是一项挑战。这正是发生的情况。我的问题是,我能改变这种行为吗?我们的体系结构只定义了负责事务的一层。这是通过拦截器完成的,拦截器分别在调用带注释的方法(或类)之前和之后打开/提交/回滚事务。现在我们想要强制执行,对持久化对象的更改必须在事务内部进行。通过这种方式,我们可以强制我们的业务模型上的所有更改都在一个地方进行事务性的、安全的和“干净的”。你不能这样做。您不应该使用隐式事务:。但是,如果您希望该实体不发生更改,可以使用session.execute(),它将从会话中分离,并且不会保存任何更改。嗨,Anton,感谢您共享此链接。无论如何,我们不使用隐式事务,而是显式地将一些ServiceInterface声明为事务性的(如上所述)。