我的所有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
感谢任何建议,想法和评论!
答案 0 :(得分:0)
之前我遇到过类似的问题,与隔离级别有关。默认隔离级别设置为“Snapshot”,并且在SQL Server上运行时,这意味着第一个事务在启动后不会看到任何更改。也许这是你的隔离级别?
如果没有,尝试在处理上面的那个之后直接创建一个全新的TransactionScope,看看你是否可以把它作为新的回读。如果你做不到,那可能与外部交易无关。
希望有所帮助。
马库斯