как обеспечить согласованность данных - PullRequest
1 голос
/ 09 июля 2010

c # application.

Я делаю выбор с последующим обновлением столбца в таблице.Я помещаю их в отдельную транзакцию с уровнем изоляции, установленным в Serializable.Я делаю это для обеспечения согласованности данных.

Но все же я могу проверить, что несколько пользователей могут читать (выбирать) одно и то же значение и в конечном итоге пытаются обновить с одним и тем же значением.

МожетКто-нибудь подскажет, как мне достичь согласованности, например,

Нет двух пользователей, читающих одно и то же значение.
Ни один пользователь не прочитал значение, которое обновлено, но еще не зафиксировано.

Ответы [ 6 ]

2 голосов
/ 09 июля 2010

Если вы хотите предотвратить , это называется пессимистической блокировкой.Вы можете сделать это с помощью (Table | Row) блокировок, но это снизит вашу производительность.

«Стандартный» способ - использовать оптимистичный параллелизм и решить проблему после того, как это произошло.

Нет двух пользователей, читающих одно и то же значение.

Вы можете (только) убедиться в этом, разрешив одновременно только 1 соединение.

Ни один пользователь не прочитал значение, которое обновлено, но еще не зафиксировано.

Для этого требуется только (намного более легкий) уровень изоляции ReadCommitted.

1 голос
/ 09 июля 2010

Есть много разных способов добиться этого. Вы можете использовать метки времени в своих записях. Когда вы делаете обновление, вы удостоверяетесь, что идентификатор совпадает, а отметка времени, которую ваше приложение извлекло с записью, совпадает.

Чтобы пользователь не читал запись, которая не была передана, используйте подсказки sql в своих запросах.

1 голос
/ 09 июля 2010

Я думаю, что вы имеете в виду Параллельность . Проверьте ссылку, чтобы начать понимать ее, если это то, о чем вы спрашиваете. Вам, вероятно, придется сделать немного больше исследований в зависимости от вашей серверной части и вашей конкретной ситуации. Опять же, если это то, что вы ищете, вас может заинтересовать пессимистичный параллелизм.

http://en.wikipedia.org/wiki/Concurrency_control

Обработка проблем параллелизма в .NET

0 голосов
/ 10 июля 2010

Нет двух пользователей, читающих одно и то же значение.

Чтобы сделать это, в своем выражении SET TRANSACTION добавьте RESERVING mytable FOR PROTECTED WRITE (или локальный эквивалент в вашей базе данных).

Ни один пользователь не прочитал значение, которое обновлено, но еще не зафиксировано.

Если вы используете SERIALIZABLE транзакции, у вас не будет этой проблемы.

0 голосов
/ 09 июля 2010

Как насчет размещения обновления с возвратом в обработанный процесс и вызовом его из моего приложения.

Это решит все проблемы?

0 голосов
/ 09 июля 2010

один из способов выполнить задачу: вам нужно будет добавить поле «блокировка» к вашей таблице.

, затем вы должны написать хранимую процедуру, которая будет принимать некоторый идентификатор в качестве параметра, атомарно выбрать строку с блокировкой NULL, обновить строку таким образом, чтобы блокировка содержала переданный идентификатор, а затем вернуть значение.

Пока хранимая процедура выполняется атомарно (любые другие запросы для таблицы будут ждать до тех пор, пока эта процедура не будет завершена), каждый клиент, вызывающий эту процедуру, получит другое значение, в котором поле блокировки все еще не заполнено. Как только значение возвращается, клиент уверен, что для строки, содержащей это значение, в поле блокировки установлено какое-то значение, и оно не будет возвращено.

После внесения изменений вы должны обновить строку, записать новое значение и установить для поля блокировки значение NULL, тем самым «разблокировав» строку для будущих запросов.

...