Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Select ..... FOR Update  [new]
FM32YO aka KID
Member

Откуда: Ukraine
Сообщений: 884
Чтобы не быть голословным, по отношению к игнорированию доков = цитата из тома Кайта:
Разработчику необходим метод реализации данного бизнес-правила в многопользо-
вательской среде, способ, гарантирующий что в каждый момент времени только один
сеанс резервирует данный ресурс. В данном случае решение состояло в программном
упорядочении доступа — кроме представленного выше запроса count(*), необходимо
было сначала выполнить:
select * from resources where resource_name = :room_name FOR UPDATE;

Что же делаю так точно....
форма с гридом - вызов следующей формы для редактирования строки грида, при запуске формы редактирования выполняется следующее (цитирую SQL-monitor)
----------------------------------
Timestamp: 16:43:45.325

SELECT a.id, a.outdate, a.backdate, b.fio || ' ' || b.NAME || ' ' || b.OTCH AS 
ItW,
	a.person, 
	a.aim, a.report, c.name,
	a.whereto
	FROM Invent.Vidr a,
	invent.ITWorkers b,
	invent.RVD c
	WHERE a.person = b.tn
	AND
	a.whereto = c.id
	AND a.id = :1  FOR UPDATE

:1 = 8
----------------------------------
На соседней машине запускаю ТО ЖЕ САМОЕ...
Почему-то мне казалось, что FOR UPDATE должен мне запретить на соседней машине выполнить этот запрос.. ан нет.. получилось, что одну и ту же запись могу модифицировать и там и тут....
Ткните меня - в чем я грубо ошибаюсь????
(да, если все это проделать на одной машине = запустил 2 экзмепляра прошгаммы - то тут FOR UPDATE работает как надо)

Если важно - то коннект идет через Oracle ODBC driver 8.00.5
31 окт 06, 17:55    [3337564]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
FM32YO aka KID
Member

Откуда: Ukraine
Сообщений: 884
тьфу глянул, что написал... подумалось (нельзя гадать - это понятно)
НО!!!
Select ..... FOR Update 
работает только в случае, если в запросе ОДНА таблица????
31 окт 06, 17:58    [3337579]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Ну, конечно, такого не бывает. Чтобы убедиться - попробуйте то же в
двух Sql*Plus-ах.
Имхо - транзакция ваша, скорее всего, тихонько закрылась (например, commit-ом)
31 окт 06, 18:01    [3337599]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
или выборки не пересекаются по строкам
31 окт 06, 18:02    [3337609]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
YAP
Member

Откуда: Киев
Сообщений: 2116
1) odbc имеет привычку по дефолту автокоммитить
2) учтите еще наличие секции OF (правда бы
FOR UPDATE
[OF [[schema .] { table | view } .] column
[, [[schema .] { table | view } .] column]...
]
[ NOWAIT | WAIT integer ]
31 окт 06, 18:08    [3337647]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
FM32YO aka KID
Member

Откуда: Ukraine
Сообщений: 884
да вот хрен его знает....
специально следил через СКЛ-монитор...... вроде ни явно ни неявно нигде нет коммита....
- идет просто селект определенной записи
- пока на форме запись отображена - на соседней машине так точно отображаю ту же самую запись....
-изменяю 1-ю - сохраняю
-изменяю на 2-й машине - сохраняю
ПОЛУЧАЮ "кто последний встал - того и тапки..."
А ведь результат ожидал иной....

да.. я верю, что, если бы делал все это через СКЛ+ - то получил бы блокировку....
но делаю-то я это из клиентского приложения, которое через ОДБС драйвер работает......
(в том же ТОАД-е такая вещь не проходит...)
вот и задумался... ".... а как...?"

Как результат - будем читать Кайта дальше :-)
Или же это кривость ОДБС драйвера...
31 окт 06, 18:10    [3337661]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
contr
Member

Откуда:
Сообщений: 1909
FM32YO aka KID
Или же это кривость ОДБС драйвера...

Отключите autocommit
31 окт 06, 18:13    [3337683]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
Не знаю, как ODBC, но вообще-то, если в SELECT более одной таблицы, то после FOR UPDATE надо указывать поле той таблицы, которую хотим изменять. Причем здесь поведение разное у разных версий (проверял на 8 и 9, но у кого какая реакция, сейчас не помню). Короче, одни версии в этом случае (если не указывать поле) ругаются, другие молча глотают и ни-ч-ч-его не делают.
31 окт 06, 18:29    [3337792]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
tru55
если в SELECT более одной таблицы, то после FOR UPDATE надо указывать поле той таблицы, которую хотим изменять. Причем здесь поведение разное у разных версий (проверял на 8 и 9, но у кого какая реакция, сейчас не помню). Короче, одни версии в этом случае (если не указывать поле) ругаются, другие молча глотают и ни-ч-ч-его не делают.
Да? А можно пример, на какой-нибудь из версий? Про 8ку не скажу, но на 9ках и 10ках такого замечено никогда не было.
31 окт 06, 18:44    [3337889]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
RA\/EN
Member

Откуда:
Сообщений: 3658
tru55
Не знаю, как ODBC, но вообще-то, если в SELECT более одной таблицы, то после FOR UPDATE надо указывать поле той таблицы, которую хотим изменять. Причем здесь поведение разное у разных версий (проверял на 8 и 9, но у кого какая реакция, сейчас не помню). Короче, одни версии в этом случае (если не указывать поле) ругаются, другие молча глотают и ни-ч-ч-его не делают.

Oracle® Database SQL Reference
10g Release 2 (10.2)
OF ... column
Use the OF ... column clause to lock the select rows only for a particular table or view in a join. The columns in the OF clause only indicate which table or view rows are locked. The specific columns that you specify are not significant. However, you must specify an actual column name, not a column alias. If you omit this clause, then the database locks the selected rows from all the tables in the query.
31 окт 06, 18:47    [3337908]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
contr
Member

Откуда:
Сообщений: 1909
RA\/EN
Oracle® Database SQL Reference
10g Release 2 (10.2)
OF ... column
Use the OF ... column clause to lock the select rows only for a particular table or view in a join. The columns in the OF clause only indicate which table or view rows are locked. The specific columns that you specify are not significant.

Во заливаютЪ...
Имеет смысл и в однотабличных запросах, если слово "согласованность" хоть что-то значит в рамках целевого дизайна :)
31 окт 06, 18:54    [3337937]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
PL/SQL User’s Guide and Reference

Using FOR UPDATE

When querying multiple tables, you can use the FOR UPDATE clause to confine row
locking to particular tables. Rows in a table are locked only if the FOR UPDATE OF
clause refers to a column in that table.

Сейчас по рукой тестов нет, но, если не путаю, без OF <column> в 8.1.7 просто ругался, а в 9.2 просто не выполнял UPDATE (правда, вроде проверял через UPDATE ... WHERE CURRENT OF <curs1>)
31 окт 06, 18:55    [3337945]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
contr
Member

Откуда:
Сообщений: 1909
tru55

When querying multiple tables, you can use the FOR UPDATE clause to confine row locking to particular tables. Rows in a table are locked only if the FOR UPDATE OF
clause refers to a column in that table.

ИМХО речь идет о том, что ежели OF таки написан, то вот тогда и будут заблокированы строки только той таблицы, колонки которой перечислены в OF...
31 окт 06, 18:58    [3337965]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
FM32YO aka KID
Member

Откуда: Ukraine
Сообщений: 884
Огромное спасибо за советы!!!
вариант
SELECT a.id, a.outdate, a.backdate, b.fio || ' ' || b.NAME || ' ' || b.OTCH AS 
ItW,
	a.person, 
	a.aim, a.report, c.name,
	a.whereto
	FROM Invent.Vidr a,
	invent.ITWorkers b,
	invent.RVD c
	WHERE a.person = b.tn
	AND
	a.whereto = c.id
	AND a.id = :1  FOR UPDATE OF a.outdate, a.backdate,
	a.person, a.aim, a.report, a.whereto

:1 = 8

работает на УРА!!!!
1 ноя 06, 09:17    [3338904]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
Селедка Пошубовна
Guest
FM32YO aka KID
Огромное спасибо за советы!!!
вариант
SELECT a.id, a.outdate, a.backdate, b.fio || ' ' || b.NAME || ' ' || b.OTCH AS 
ItW,
	a.person, 
	a.aim, a.report, c.name,
	a.whereto
	FROM Invent.Vidr a,
	invent.ITWorkers b,
	invent.RVD c
	WHERE a.person = b.tn
	AND
	a.whereto = c.id
	AND a.id = :1  FOR UPDATE OF a.outdate, a.backdate,
	a.person, a.aim, a.report, a.whereto

:1 = 8

работает на УРА!!!!

Еще один совет - выкинь нах из фразы for update все столбцы, кроме одного (желательно изменяемого реже всего)
1 ноя 06, 09:39    [3338989]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
RA\/EN
Member

Откуда:
Сообщений: 3658
Селедка Пошубовна
Еще один совет - выкинь нах из фразы for update все столбцы, кроме одного (желательно изменяемого реже всего)

А тайный смысл этого предложения? Блокируется-то строка.
1 ноя 06, 10:35    [3339326]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
contr
Member

Откуда:
Сообщений: 1909
RA\/EN
Селедка Пошубовна
Еще один совет - выкинь нах из фразы for update все столбцы, кроме одного (желательно изменяемого реже всего)

А тайный смысл этого предложения? Блокируется-то строка.

Зато рестартуется весь statement :)
1 ноя 06, 16:14    [3342568]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
contr
RA\/EN
Селедка Пошубовна
Еще один совет - выкинь нах из фразы for update все столбцы, кроме одного (желательно изменяемого реже всего)

А тайный смысл этого предложения? Блокируется-то строка.

Зато рестартуется весь statement :)

И все равно непонятно, в чем смысл совета ? Надо обновить 10 столбцов, значит блокировку надо ставить на 10 столбцов.
1 ноя 06, 17:17    [3343236]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
блокировку надо ставить на 10 столбцов

Ну сказали же уже. Достаточно упомянуть 1 столбец в изменяемой таблице, т.к. блокируется все равно СТРОКА, а не столбцы
1 ноя 06, 17:21    [3343279]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
Сельдерей Макаронович
Guest
contr
RA\/EN
Селедка Пошубовна
Еще один совет - выкинь нах из фразы for update все столбцы, кроме одного (желательно изменяемого реже всего)

А тайный смысл этого предложения? Блокируется-то строка.

Зато рестартуется весь statement :)
Зачет :)


Неизвестный автор
2) Команда SELECT FOR UPDATE может выполняться в один или два этапа. На первом этапе (на фазе exec) производится поиск всех строк таблицы, удовлетворяющих предикату , и попытка их блокировки. Как и в случае с командами UPDATE, DELETE и MERGE, при этом производится сравнение двух версий строк – в CR-блоке и в CURRENT-блоке. В сравнении принимают участие все столбцы, упомянутые в команде SELECT FOR UPDATE – в списке выборки, предикате или в списке модифицируемых столбцов (это столбцы, перечисленные во фразе UPDATE OF, обновлять в последствии их необязательно – мы просто как бы выражаем намерение их обновить). Если версии сравниваемых столбцов совпадают, то производится блокировка строки, иначе Oracle запоминает, что были не совпавшие версии и продолжает блокировку далее

Неизвестный автор
· описание фразы OF команды SELECT FOR UPDATE в SQL Reference гласит: “The columns in the OF clause only indicate which table or view rows are locked. The specific columns that you specify are not significant”. На самом деле, как мы видим, список столбцов во фразе OF имеет значение, так как эти столбцы принимают участие в сравнении содержимого двух версий блокируемой строки. Поэтому без необходимости желательно вообще не пользоваться этой фразой, а если вы ей пользуетесь, то помните о ее влиянии на вероятность возникновения “мини-откатов”;
1 ноя 06, 18:16    [3343718]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6910
to Сельдерей Макаронович: а полный текст, а лучше даже сслыку дать можете?
1 ноя 06, 18:59    [3343910]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
to Сельдерей Макаронович Действительно, можно дать ссылочку или привести полностью текст и источник цитаты? Достаточно интересное влияние списка столбцов перечисленных в OF.
P/S Вечером попробую проверить.
2 ноя 06, 09:22    [3345115]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
Текст
Guest
alex-ls
to Сельдерей Макаронович: а полный текст, а лучше даже сслыку дать можете?

Если не ошибаюсь, то это текст Сергея Маркеленкова (поискать на форуме можно). Сцылку дать не могу т.к. не имею, а текст стесняюсь, т.к. все-таки не я автор...
Ключевое слово мини-откат (mini-rollback)
2 ноя 06, 12:21    [3346430]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
Посмотрел, какое влияние оказывает список столбцов после OF, никакого влияния этих столбцов на рестарт не заметил, т.е. если значение в этих столбцах фактически изменяем, то идет ожидаемый рестарт в другой сесии, если не меняем, то рестарта нет. Или о чем шла речь?
Схема проверки:
ses1> select t.id, t.y from test_tab t where id = 3 for update of y;
ses2> update test_tab set y = 1 where y = -1 or id in (2, 3);
ses3> update test_tab set y = -1 where id in ( 1,5 );
ses3> commit;
ses1> commit;
Рестарта во второй сесии не вижу.
Так что смысл совета
автор
выкинь нах из фразы for update все столбцы, кроме одного (желательно изменяемого реже всего)
все еще остается загадкой.
8 ноя 06, 10:56    [3366865]     Ответить | Цитировать Сообщить модератору
 Re: Select ..... FOR Update  [new]
contr
Member

Откуда:
Сообщений: 1909
ten
Посмотрел, какое влияние оказывает список столбцов после OF, никакого влияния этих столбцов на рестарт не заметил, т.е. если значение в этих столбцах фактически изменяем, то идет ожидаемый рестарт в другой сесии, если не меняем, то рестарта нет. Или о чем шла речь?
Схема проверки:
ses1> select t.id, t.y from test_tab t where id = 3 for update of y;
ses2> update test_tab set y = 1 where y = -1 or id in (2, 3);
ses3> update test_tab set y = -1 where id in ( 1,5 );
ses3> commit;
ses1> commit;
Рестарта во второй сесии не вижу.

Читайте широко известного в узких кругах "неизвестного автора" внимательнее: "В сравнении принимают участие все столбцы, упомянутые в команде SELECT FOR UPDATE – в списке выборки, предикате или в списке модифицируемых столбцов"
8 ноя 06, 12:34    [3367896]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить