只是想知道在IHttpModule中使用TransactionScope的其他想法是什么。 例如:
BeginRequest
//start new TransactionScope
// start UOW
// Begin UOW transaction
// do some stuff...
EndRequest:
// commit UOW
// commit transaction scope
在http请求的生命周期内保持transactioncope打开真的是一个明智的想法吗? 我需要同时写入事务性MSMQ并且需要TransactionScope。我希望持久存储数据库更新以及要发送的MSMQ消息,否则,将其全部回滚...
有什么建议吗?
答案 0 :(得分:3)
这会随机失败,因为在ASP.NET中无法保证BeginRequest和EndRequest将在同一个线程上发生(又名thread-agility)。如果您尝试在与创建它的线程不同的线程上处理它,则事务范围将引发异常。因此,在偶然的事件中,EndRequest在不同的线程上执行,然后是BeginRequest,抛出了这个异常。
更多细节:
http://www.mattwrock.com/post/2010/12/26/Getting-TransactionScope-to-play-nice-with-NHibernate.aspx