2010-06-07 3 views
2

Я хочу выполнить обновление и выбрать результат. Я не хочу, чтобы что-то могло обновлять строку, которую я обновляю, до тех пор, пока не произойдет выбор. Как мне это сделать?SQL Server 2005 и SELECT и UPDATE заблокированы

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

Я пропустил обозначение этого как SQL Server 2005. Я фактически работаю с сервером 2000. Таким образом, предложение вывода не работает (нет в этой версии).

BEGIN TRANSACTION 
UPDATE Table SET Last=(Last+1) WHERE ID=someid; 
SELECT * FROM Table WHERE ID=someid; 
COMMIT TRANSACTION 
+0

Вы определенно не выполняете 'select> update> select' с первым выбором получения значения, используемого в обновлении? –

+0

Я добавляю отладку, чтобы найти точные значения, все, что я знаю, это то же самое. – aepheus

+0

Можете ли вы опубликовать код? –

ответ

3
BEGIN TRAN 
UPDATE ... 
SELECT... 
COMMIT 

Если сделать это даже на уровне изоляции транзакций по умолчанию прочитанного совершенного.

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

UPDATE <YourTable> 
    SET ... 
OUTPUT INSERTED.* 
WHERE ... 
+0

Спасибо, Begin/Commit - именно то, что я искал. – aepheus

+0

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

+0

Это, похоже, не срабатывало так, как я ожидал. Тестирование этим утром, похоже, показывает, что по-прежнему существует проблема с обновлением и выбором. Кажется, что два «обновления, затем выберите», вызовы могут прийти и произойти примерно так: update> update> select> select. Если оба выбора заканчиваются одинаковым значением, когда они должны иметь разные значения. Примечание: все это в одной строке. – aepheus

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