2010-07-27 41 views
0

这个问题纯属AR相关。Active Record/Nhibernate TransactionScopes问题

假设我的web/wcf应用程序中有2层--DataLayer和BusinessLayer。 DataLayer包含几乎在映射上工作的原子操作(查找,获取,保存,特殊查找,交叉查找等:))。有很多HQL或Criterias。这一层没有使用SessionScopes。我的一些映射包含懒惰集合。

现在,BL层具有包含与DL调用混合在一起的业务逻辑的方法 - 这很正常。对于每个只有只读操作的公共方法,我都指定了SessionScope(FlushAction.Never)。对于所有那些有一些保存或更新操作的方法,我使用TransactionScope(),里面带有try catch,方法结束时有直接的VoteCommit,catch子句中有VoteRollback。我将ReadCommitted设置为isolationLevel。

对于基本情况这个工作。当我编写使用其他方法和自己的事务的方法时,我开始遇到真正的问题 - 我正在谈论锁。例如,我有事务递归的方法。 似乎某些'读取'方法(拥有自己的SessionScope(FlushAction.Never))由于其他事务而被阻塞。

我不能确切地追查究竟是什么错误,但我开始认为我有一些主要的设计问题。

城堡网站上的帮助对我来说并没有多大的帮助,同时在AR源中也有测试 - 它们对我来说太简单了。

任何人都可以真正解释我应该如何使用TransactionScopes或什么是我的错误?

+0

你在用温莎吗? – 2010-07-27 12:47:15

+0

不是。你有什么建议? – IamDeveloper 2010-07-27 15:04:59

回答

1

我推荐使用Castle.Service.Transaction,它允许您以声明方式而不是显式方式执行事务。这通常通过Automatic Transaction Management facility使用,但它需要Windsor

+0

那么,我已经实现了按会话请求的方法。 您是否认为使用Windsor软件包更有意义? – IamDeveloper 2010-07-28 07:53:59

+0

@StupidDeveloper:如果你想使用交易,是的。如果你不需要交易,那么不需要。 – 2010-07-28 12:35:43

相关问题