gpt4 book ai didi

sql-server - 如何在 NHibernate 中进行嵌套事务?

转载 作者:行者123 更新时间:2023-12-02 03:59:53 24 4
gpt4 key购买 nike

我可以在 NHibernate 中执行嵌套事务吗?如何实现它们?我使用的是 SQL Server 2008,因此 DBMS 肯定提供支持。

我发现如果我尝试这样的事情:

using (var outerTX = UnitOfWork.Current.BeginTransaction())
{
using (var nestedTX = UnitOfWork.Current.BeginTransaction())
{
... do stuff
nestedTX.Commit();
}

outerTX.Commit();
}

然后,当到达 outerTX.Commit() 时,事务已变为非事件状态,并导致 session AdoTransaction 上出现 ObjectDisposeException。

因此我们是否应该创建嵌套的 NHibernate session ?或者我们是否应该使用其他一些类来包装事务(我听说过 TransactionScope,但我不确定那是什么)?

我现在使用Ayende's UnitOfWork implementation (感谢斯尼尔)。

请原谅这个问题的任何天真,我对 NHibernate 还是个新手。

谢谢!

编辑:我发现您可以使用 TransactionScope,例如:

using (var transactionScope = new TransactionScope())
{
using (var tx = UnitOfWork.Current.BeginTransaction())
{
... do stuff
tx.Commit();
}

using (var tx = UnitOfWork.Current.BeginTransaction())
{
... do stuff
tx.Commit();
}

transactionScope.Commit();
}

但是我对此并不那么兴奋,因为它使我们只能使用 SQL Server,而且我还发现,如果数据库是远程的,那么您必须担心是否启用了 MSDTC...组件出错。嵌套事务在 SQL 中非常有用且易于实现,我有点假设 NHibernate 会有某种方法来模拟相同的...

最佳答案

NHibernate session 不支持嵌套事务。

以下测试在版本 2.1.2 中始终正确:

var session = sessionFactory.Open();
var tx1 = session.BeginTransaction();
var tx2 = session.BeginTransaction();
Assert.AreEqual(tx1, tx2);

您需要将其包装在 TransactionScope 中以支持嵌套事务。

必须启用 MSDTC,否则您将收到错误消息:

{“分布式事务管理器 (MSDTC) 的网络访问已被禁用。请使用组件服务管理工具在 MSDTC 的安全配置中启用 DTC 进行网络访问。”}

关于sql-server - 如何在 NHibernate 中进行嵌套事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1192111/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com