Что имеет значение, когда я использую FOR UPDATE OF SAL
или просто пишу FOR UPDATE
.Разница между ОБНОВЛЕНИЕМ И ОБНОВЛЕНИЕМ
Согласно O'Reilly
The Перечня предложении UPDATE FOR не ограничивает вас к изменению только те столбцы в списке. Замки все еще размещены на всех строках; список OF просто дает вам способ более четко документировать то, что вы намерены изменить . Если вы просто укажете FOR UPDATE в запросе и не включите один или несколько столбцов после ключевого слова OF, тогда база данных будет заблокировать все идентифицированные строки по всем таблицам, перечисленным в предложении FROM.
Что означает, когда я указать имя столбца с FOR UPDATE OF SAL
, другой пользователь может внести изменения только с SAL
колонкой. Но практически это не так. Я все еще получаю блокировку в другой сессии. Может кто-нибудь объяснить разницу.
UPDATE
----- SESSION 1
declare
emp_info emp.ename%type;
cursor emp_cur is select ename from emp join dept using(deptno) where deptno=&no for update of sal;
begin
open emp_cur;
loop
fetch emp_cur into emp_info;
exit when emp_cur%notfound;
dbms_output.put_line(emp_info);
end loop;
close emp_cur;
end;
----- SESSION 2
update emp set comm=5 where deptno=10;
---- hanged/waiting in session 2
Нет, я хотел сказать, что это позволит мне обновить, когда я попытаюсь обновить другой столбец. Даже, я присоединяюсь к двум таблицам, но по-прежнему тем же сценариям. Пожалуйста, проверьте мое обновленное сообщение и объясните, пожалуйста. – Ravi
@jWeavers - вы не сможете обновить столбец в таблице, если эта таблица не имеет ссылок в предложении 'OF'. В любом случае, используя 'WHERE CURRENT OF', вам нечего обновлять что-либо, что вам нравится, с помощью обычного' UPDATE' без этого предложения, в том числе в таблицах, которые вы заблокировали с помощью 'FOR UPDATE', поскольку вы держите эту блокировку. –
@jWeavers - из вашего обновления: справа, вы заблокировали ** строку ** в 'emp', поэтому второй сеанс должен дождаться, когда первый сеанс освободит блокировки (' commit'/'rollback') хотя никаких обновлений не было сделано. Второй сеанс может обновить 'dept', хотя в столбце' OF' нет столбцов из этой таблицы. –