簡體   English   中英

在Nhibernate中缺少對環境事務的支持嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM