刷新单独的Castle ActiveRecord事务,并在另一个事务中刷新对象

问题描述:

我已将所有ASP.NET请求包装在会话中,并且只有在请求最后才会提交事务。刷新单独的Castle ActiveRecord事务,并在另一个事务中刷新对象

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

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

所以我已经试过包装用新SessionScope,TransactionScope的(TransactionMode.New),两者的结合插入代码,手动冲洗一切等

然而,当我打电话刷新的对象我米仍然得到旧的对象状态。

下面是一些代码样本我所看到的:

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 

任何建议,想法和意见是值得赞赏!

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

如果没有,尝试配置上面的那个后直接创建一个全新的TransactionScope,看看你是否可以读取它如新。如果你不能,这可能与外部交易无关。

希望有所帮助。

Marcus

+0

感谢马库斯,试过了,但不幸的是它没有做到这一点。我刚刚结束了在ActiveRecord之外的所有事情。 – eanticev 2010-07-08 14:27:30