刷新单独的Castle ActiveRecord Transaction,并刷新另一个Transaction中的对象

时间:2010-06-15 00:39:54

标签: asp.net nhibernate castle-activerecord transactions

我的所有ASP.NET请求都包含在一个Session和一个仅在请求的最后提交的Transaction中。

在执行请求期间的某个时刻,我想插入一个对象并使其对其他潜在线程可见 - 即将插入拆分为新事务,提交该事务,然后继续。

原因是有问题的请求命中了一个API,然后链接到我的另一个页面(几乎同步),让我知道它已处理,因此双提交事务记录,因为原始请求没有尚未完成,因此未提交交易记录。

所以我尝试用新的SessionScope,TransactionScope(TransactionMode.New)包装插入代码,两者结合,手动刷新所有内容等。

但是,当我在对象上调用Refresh时,我仍然会得到旧的对象状态。

以下是我所看到的一些代码示例:

Post outsidePost = Post.Find(id); // status of this post is Status.Old
using (TransactionScope transaction = new TransactionScope(TransactionMode.New))
{
    Post p = Post.Find(id);
    p.Status = Status.New; // new status set here
    p.Update();

    SessionScope.Current.Flush();
    transaction.Flush();
    transaction.VoteCommit();
}
outsidePost.Refresh();
// refresh doesn't get the new status, status is still Status.Old

感谢任何建议,想法和评论!

1 个答案:

答案 0 :(得分:0)

之前我遇到过类似的问题,与隔离级别有关。默认隔离级别设置为“Snapshot”,并且在SQL Server上运行时,这意味着第一个事务在启动后不会看到任何更改。也许这是你的隔离级别?

如果没有,尝试在处理上面的那个之后直接创建一个全新的TransactionScope,看看你是否可以把它作为新的回读。如果你做不到,那可能与外部交易无关。

希望有所帮助。

马库斯