Сбросить отдельную транзакцию Castle ActiveRecord и обновить объект в другой транзакции - PullRequest
0 голосов
/ 15 июня 2010

Все мои запросы ASP.NET упакованы в сеанс и транзакцию, которая фиксируется только в самом конце запроса.

В какой-то момент во время выполнения запроса я бынравится вставлять объект и делать его видимым для других потенциальных потоков - то есть разделить вставку на новую транзакцию, зафиксировать эту транзакцию и двигаться дальше.

Причина в том, что рассматриваемый запрос попадает в 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 голосов
/ 06 июля 2010

У меня раньше была похожая проблема, связанная с уровнями изоляции. Уровень изоляции по умолчанию был установлен на «Снимок», и при запуске на SQL Server это означало, что первая транзакция не увидит ничего, что изменилось с момента ее запуска. Может быть, это ваш уровень изоляции?

Если нет, попробуйте создать совершенно новый TransactionScope сразу же после удаления указанного выше, и посмотрите, сможете ли вы прочитать его обратно как Новый. Если вы не можете, это, вероятно, не имеет ничего общего с внешней транзакцией.

Надеюсь, это поможет.

Марк

...