при update сначала лочит или считывает ???

Tantor
Дата: 01.10.2004 13:03:40
Доброго времени суток.

Предположим, делаем update:
update tab
set col1 = col1 + 10
where col2 = 1;

Вопрос такой:
Вот нашел он по условию необходимые строки. Что он делает дальше? Сначала лочит эти строки а затем считывает и изменяет? Или сначала считывает, затем лочит и изменяет?

Дело в том, что если идет одновременно два таких update и все делается по второму сценарию, то в итоге col1 увеличится только на 10, а не на 20.

Спасибо.
igor2222
Дата: 01.10.2004 13:23:47
Да неправда всё это. Второй апдейт начнет выполняться только тогда, когда первый получит commit или rollback.
Другое дело если Вы делаете селект этого самого параметра (1) и по нему выполняете апдейт.
Oleg Afanasiev
Дата: 01.10.2004 14:56:49
сначала читает , потом пытается лочить.
denm
Дата: 01.10.2004 15:15:29
Может тут найдёте ответ:

Write consistency by READ COMMITED isolation level
Tantor
Дата: 01.10.2004 15:20:53
Так смотрите. Одновременно началось два апдейта. Одновременно они считали старые данные. Далее, один из апдейтов "залочил" данные и правит их, затем делает коммит. Потом второй апдейт, дождавшись пока строка освабодится, лочит эти же данные, НО считывание данных для этого апдейта произошло до изменения этих данных первым апдейтом(одновременно начались). Следовательно второй апдейт не знает что данные уже изменены.
Вот.

Это если сначала считывает, затем лочит.
Или он там как-то очень хитро считывает?
DinoRay
Дата: 01.10.2004 15:35:13
У Кайта в первой книге пример про банкоматы есть, посмотри очень наглядно.
Tantor
Дата: 01.10.2004 15:55:47
Интересует случай, когда считывание произошло одновременно, а не сначала в одной сесси залочили, а затем уже обратились из второй.
Как сработают блокировки а не транзакции?

А про банкоматы это больше относится к согласованности по чтению, на мой взгляд.
Oleg Afanasiev
Дата: 01.10.2004 15:57:27
одновременно не получится
только по очереди
Stax
Дата: 01.10.2004 16:19:40
1 Лочит по мере чтения (продвидения) по строкам
2 Если нарывается на измененню строку
2.1 если взаимоблокировка снимает виновную сессию
2.2 если не взаимоблокировка ждет
2.2.1 После снятия блокировки (commit),
сканирует строки сначала и изменяет их состояние
на начало второго сканирования,
поетому будут учтены результаты закончившейся раньше транзакции,
которая могла начаться и позже забокированной (как карта ляжет)
Stax
Дата: 01.10.2004 16:24:09
недосмотр,
п 2.2.1 если изменялось условие отбора (не ваш вариант)

Напр для такого
set col1 = col1 + 0.1 * col1, col2=col2+1
where col2 <5;