开发者

Flush separate Castle ActiveRecord Transaction, and refresh object in another Transaction

开发者 https://www.devze.com 2023-01-03 06:15 出处:网络
I\'ve got all of my ASP.NET requests wrapped in a Session and a Transaction that gets commited only at the very end of the request.

I've got all of my ASP.NET requests wrapped in a Session and a Transaction that gets commited only at the very end of the request.

At some point during execution of the request, I would like to insert an object and make it visible to other potential threads - i.e. split the insertion into a new transaction, commit that transaction, and move on.

The reason is that the request in question hits an API that then chain hits another one of my pages (near-synchronously) to let me know that it processed, and thus double submits a transaction record, because the original request had not yet finished, and thus not committed the transaction record.

So I've tried wrapping the insertion code with a new SessionScope, TransactionScope(TransactionMode.New), combination of both, flushing everything manually, etc.

However, when I call Refresh on the object I'm still getting the old object state.

Here's some code sample for what I'm seeing:

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();
    transacti开发者_如何转开发on.VoteCommit();
}
outsidePost.Refresh();
// refresh doesn't get the new status, status is still Status.Old

Any suggestions, ideas, and comments are appreciated!


I've had a similar problem before, related to isolation levels. The default isolation level was set to "Snapshot", and when running on SQL Server, this meant that the first transaction would not see anything that changed since it started. Maybe it's your isolation level?

If not, try creating a brand-new TransactionScope straight after disposing the one above, and see if you can read it back as New. If you can't, it's probably nothing to do with the outside transaction.

Hope that helps.

Marcus

0

精彩评论

暂无评论...
验证码 换一张
取 消