[英]Missing support for ambient transactions in nhibernate?
我知道NHibernate支持環境事務,因為NHibernate會話在事務范圍內加入環境事務。 但是,存在一些奇怪之處,請考慮以下測試:
[Test]
public void Transaction_RollsBackTransactionInsideOfAmbientTransaction_AmbientTransactionAborted()
{
// arrange
ISessionFactory sessionFactory = SessionFactoryOneTimeInitializer.GetTestSessionFactory();
ISession session = sessionFactory.OpenSession();
SessionFactoryOneTimeInitializer.CreateDataBaseSchemaIfRequiredByConfiguration(session);
using (new TransactionScope())
{
using (ITransaction transaction = session.BeginTransaction())
{
// act
transaction.Rollback();
}
// assert
Assert.AreEqual(TransactionStatus.Aborted, Transaction.Current.TransactionInformation.Status);
}
}
該測試失敗。 NHibernate如何確保環境事務不會持久化到數據庫?
我比較了解Hibernate在Java世界中如何與JTA一起工作,但是我不是.NET專家。 但是您的問題引起了我的注意。
在Java中,您需要使用JDBC或JTA事務配置Hibernate。 在這種情況下,由Hibernate返回的Transaction
對象將包裝綁定到一個數據庫連接(JDBC)的事務或包裝在線程本地的全局事務。 可以使用UserTransaction#setRollbackOnly
來使全局線程本地事務上下文無效,以確保它永遠不會成功提交。 但是,最好不要通過Hibernate管理事務,而只使用JTA提供的UserTransaction
對象。
在NHibernate中似乎還是一樣,並且有兩個事務工廠。 一種用於分布式事務 ,一種用於本地事務 。 但是兩者都返回AdoTransaction
:
public ITransaction CreateTransaction(ISessionImplementor session)
{
return new AdoTransaction(session);
}
在分布式/環境事務中,這似乎不一致。 鑒於無法在.NET AdoTransaction
全局事務上下文無效(到目前為止,我知道),因此我看不到在這種情況下rollback
將如何工作,並且AdoTransaction
似乎代表了數據庫連接上的事務。
因此,我覺得您的問題的答案是“不會”,這將說明您的測試失敗。 這意味着,如果您使用環境事務,則不應通過NHiberate管理事務。 就像在Hibernate和JTA中不推薦這樣做一樣。
編輯
另請參閱以下問題: TransactionScope如何回滾事務?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.