Может ли это обновление вызвать взаимоблокировку в oracle 10g?

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

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

UPDATE TBL1 SET DATE1=DATE2 WHERE DATE2> DATE1


person dbza    schedule 18.09.2015    source источник
comment
Должно работать: все изменения в рамках одной транзакции.   -  person Norbert van Nobelen    schedule 18.09.2015
comment
В этом случае WHERE ссылается только на саму строку и оценивается перед обновлением строки. Но я уверен, что это работает и в более сложных случаях.   -  person Kenney    schedule 18.09.2015


Ответы (1)


Oracle позаботится об этом автоматически. По сути, при запуске обновления Oracle выполняет следующие шаги:

  1. Запрашивает таблицу, т. е. оценивает предикат предложения WHERE для каждой строки в таблице.

  2. Для каждой строки, возвращаемой на шаге 1, обновите ее в соответствии с предложением SET. Значения каждого столбца — это те, которые были получены.

По этой причине вполне возможно запустить подобное обновление, которое меняет местами значения столбцов:

UPDATE TBL1 SET DATE1=DATE2, DATE2=DATE1 WHERE DATE2 > DATE1;

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

person Jeffrey Kemp    schedule 23.09.2015