Multiple TransactionScope - извлекает устаревшую информацию
Этот пост несколько связан с моим: как синхронизировать доступ к базе данных в службе WCF?
Ответы, которые я получил, были слишком сложными и \ или противоречивыми...:(
Я создал образец службы WCF и запускаю 3 экземпляра клиентов. Служба взаимодействует с таблицей SQL с именами, состоящей из нескольких строк.
Один клиент порождает функцию 1 в сервисе.
Второй клиент порождает функцию 2 в сервисе.
function 1 порождает функцию в сервисе, которая:
а. Изменяет определенную строку с "Чарли" на "Чин"
б. ждет 5 секунд
с. снова меняет строку с "Чин" на "Кэрол"
function 2 порождает функцию, которая возвращает список всех имен.
Важно отметить, что обе функции в службе заключены в "TransactionScope".
Что я делаю: я запускаю function 1 (которая меняет 'Charlie' на 'Chin' и ждет в течение 5 секунд), затем сразу же вызываю функцию function 2, которая пытается получить список имен, но зависает (потому что function 1 еще не завершила), и через пару секунд function 1 меняет имя с 'Chin' на 'Carol', и только тогда функция2 освобождается и возвращает список имен.
Дело в том, что список имен, который возвращается из function 2, не содержит "Carol"! это содержит "Чарли"! Почему это? Я думал, что так как функция2 зависла до завершения функции1, она также получит данные только после завершения функции1, но, очевидно, это не так.
Что я делаю неправильно?
Я не хочу начинать использовать блокировки, потому что это замедлит работу всей системы. У меня будет около 20 методов в моем последнем сервисе, и я не хочу, чтобы все они использовали блокировки... (только 3-4 метода предназначены для "чтения", но они будут использоваться 95% времени)...
1 ответ
Для этого вам нужно заблокировать изменяемые данные, чтобы другой процесс не мог прочитать данные, пока не завершится первый процесс.
Вы используете TransactionScope для этого. Установите уровень изоляции на сериализуемый. Это заблокирует данные. Возможно, вам придется указать, что чтение также обновляет данные (до тех же значений), чтобы ждать второго вызова.
http://msdn.microsoft.com/en-us/library/system.transactions.isolationlevel(v=vs.90).aspx