Наша база данных SQL Server 2014 установлена в READ_COMMITTED_SNAPSHOT
.Распределенная транзакция с MSMQ и SQL Server, но иногда получение грязных сообщений
Мы используем MSMQ и распределенные транзакции (мы используем MassTransit 2.10)
В одной части нашей системы мы читаем сообщение из очереди, сделать обновление базы данных, а затем опубликовать новое сообщение в очередь (все под одна транзакция).
Мы обнаружили, что обновление не выполняется при обработке следующего сообщения (оно читает из той же таблицы, что и первая часть), хотя я ожидаю, что это сообщение будет находиться только в очереди на в то же время обновляется база данных. Когда мы снова запрашиваем таблицу, обновленные данные там, как и ожидалось. Это происходит только тогда, когда мы имеем высокую нагрузку и очень редко.
Упрощенная версия нашего кода
// code that processes message 1
using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions() { Timeout = TimeSpan.FromMinutes(30), IsolationLevel = IsolationLevel.ReadCommitted })
{
MethodThatUpdatesTableX();
MethodThatCreatesMessage2();
scope.Complete();
}
// message picked up from MSMQ and then (this runs in different thread):
// code that process message 2
using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions() { Timeout = TimeSpan.FromMinutes(30), IsolationLevel = IsolationLevel.ReadCommitted })
{
MethodThatReadsFromTableX(); // so here it seems that changes made in MethodThatUpdatesTableX is sometimes (though rarely) not read
// other stuff
}
Так вот мое понимание:
Когда область расположена изменения в таблицу X привержен, а также сообщения, опубликованные в очередь
Когда MethodThatReadsFromTableX()
читает из таблицы XI, ожидается, что изменения будут там (сеанс не должен быть создан до того, как первый будет завершен, потому что он не сможет получить сообщение из очереди)
Является ли мое ожидание правильным? В чем проблема?