And*_*ite 33 nhibernate transactionscope
任何人都可以快速概述一下使用TransactionScope和NHibernate吗?我是否需要对session/IEnlistmentNotification/etc执行任何特殊操作.让这个工作?有什么陷阱我应该担心吗?例如,我可以替换所有的hibernate事务:
var transaction = session.BeginTransaction();
try
{
// code
transaction.Commit();
}
catch (Exception)
{
transaction.Rollback();
}
Run Code Online (Sandbox Code Playgroud)
有了这个?:
using (var scope = new TransactionScope())
{
// code
scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)
Iai*_*ain 18
我已经使用nHibernate 2.1一段时间了,经过一些生产问题并尝试了很多变化之后,我们已经确定了以下方法,根据避免与NHibernate和TransactionScope的泄漏连接:
using (var scope = new TransactionScope(TransactionScopeOption.Required))
{
using (var session = sessionFactory.OpenSession())
using (var transaction = session.BeginTransaction())
{
// do what you need to do with the session
transaction.Commit();
}
scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)
由于我们正在使用MSMQ和WCF,因此我们不得不使用环境事务.
我们发现不使用session.BeginTransaction()导致连接泄漏.我们还发现在提交事务后重新使用会话会导致竞争条件(nHibernate不是线程安全的,DTSC提交/回滚发生在后台线程上).
我使用不同的供应商测试了它,它只是有效.如果您没有"scope.Complete()",则事务将回滚.如果有多个持久资源,您可能需要让MSDTC运行所涉及的机器.在这种情况下,MSDTC将自动检测环境ADO.NET事务并管理整个事务.
小智 6
如果您正在使用支持使用轻量级事务管理器的连接提供程序,例如SQL Server 2005/2008,则上述工作正常.
如果您使用的是SQL Server 7/2000,那么即使您只打了一个数据库/资源,您的所有事务也将成为分布式事务.在大多数情况下,这可能不是您想要的,并且性能代价高昂.
因此,请检查您的连接提供程序和数据库服务器组合是否适合与TransactionScope一起使用.
我相信只要遵守一些约束,就可以用NHibernate事务替换它:
我希望就这些;-)
PS:我添加了Oracle详细信息,因为它们会使我的关注点和其他方面受益。
| 归档时间: |
|
| 查看次数: |
19124 次 |
| 最近记录: |