【问题标题】:Active Record/Nhibernate TransactionScopes problemsActive Record/Nhibernate TransactionScopes 问题
【发布时间】:2010-07-28 01:23:31
【问题描述】:

这个问题纯粹与 AR 相关。

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

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

对于基本情况,这是可行的。当我编写使用其他方法和内部事务的方法时,我开始遇到真正的问题——我说的是锁。例如,我有递归事务的方法。 似乎某些“读取”方法(具有自己的 SessionScope(FlushAction.Never))由于其他事务而被阻止。

我无法确定到底出了什么问题,但我开始认为我有一些重大的设计问题。

在城堡网站上的帮助对我没有多大帮助,还在 AR 资源中进行测试 - 它们对我来说太基础了。

谁能真正解释我应该如何使用 TransactionScopes 或者我的错误是什么?

【问题讨论】:

    标签: castle-activerecord transactionscope


    【解决方案1】:

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

    【讨论】:

    • 好吧,我已经实现了每请求会话的方法。你认为使用 Windsor 包还更有意义吗?
    • @StupidDeveloper:如果你想使用事务,是的。如果您不需要交易,那么不需要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多