2013-04-16 3 views
0

Мне нужно обновить несколько записей разными значениями и сделать 1 запрос на обновление.Изоляция T-SQL при множественном обновлении

Прежде чем это сделать, я проверяю все начальные значения, чтобы убедиться, что запись может быть обновлена.

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

Вот пример того, что я хочу, чтобы избежать

1) Query1 проверяет исходное значение

2) Query2 проверяет начальное значение

3) Query1 применяет обновления

4) Query2 применяется обновление

Я слышал об уровне изоляции, но не мог понять, как использовать его, чтобы избежать проблемы, не могли бы вы мне помочь ?

Заранее благодарим за помощь.

ответ

0

Используйте транзакции.

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; 
GO 
BEGIN TRANSACTION; 

--check stuff 

--update stuff 

COMMIT TRANSACTION; 

REPEATABLE READ будет убедиться, что все, что вы читали (выбор) останется прежним, пока ваш код не достигнет совершения сделки. Никто не может вносить изменения в записи, которые вы прочитали. Подробнее о транзакциях и уровне изоляции здесь SET TRANSACTION ISOLATION LEVEL

1

Интересно, почему вы не просто используете атомный UPDATE для выполнения необходимой проверки в разделе WHERE, а затем для этого обновите?

В любом случае, если Вам нужно использовать Select, а затем Update: Я имею в виду вас очень хорошая статья: http://samsaffron.com/blog/archive/2007/04/04/14.aspx

сделки необходимо, чтобы избежать грязного чтения и т.д. Но другое дело, следует обратить внимание, это ТУПИК. В распределенном подходе, если вы не используете UPDLOCK (который блокирует ресурсы для дальнейших обновлений), вы можете обновлять разные данные, которые вы читаете.

Смежные вопросы