Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как заблокировать только первую запись из селекта?
|
|||
|---|---|---|---|
|
#18+
Задача выполнить SELECT FOR UPDATE (в терминах Oracle) и желательно заблокировать только одну первую запись. Текущим результатом работы моей подкорки являеться вот такой SQL. Нужна критика и рекомендации Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. P.S. Где в документации (раздел) описаны функции rownumber() и over()? http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2006, 19:47 |
|
||
|
Как заблокировать только первую запись из селекта?
|
|||
|---|---|---|---|
|
#18+
У тебя при уровне Cursor Stability будет заблокирована после первого fetch next ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2006, 20:05 |
|
||
|
Как заблокировать только первую запись из селекта?
|
|||
|---|---|---|---|
|
#18+
А что-н. про ограничение result set-а? P.S. Почему то без USE AND KEEP UPDATE LOCKS "другая" транзакция стреляет SQLCODE: 911 что есть deadlock. Т.е. та другая не приостанавливаеться на SELECT-е, а идет дальше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2006, 20:09 |
|
||
|
Как заблокировать только первую запись из селекта?
|
|||
|---|---|---|---|
|
#18+
ничего не понятно - выполняется селект одной строки, и спрашивается, как в result set из одной строки заблокировать только первую запись......... А второй вопрос так вообще просто песня по понятливости.......... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 11:22 |
|
||
|
Как заблокировать только первую запись из селекта?
|
|||
|---|---|---|---|
|
#18+
Maxim RagozinP.S. Почему то без USE AND KEEP UPDATE LOCKS "другая" транзакция стреляет SQLCODE: 911 что есть deadlock. Т.е. та другая не приостанавливаеться на SELECT-е, а идет дальше Т.е. вы используете вышеприведенный select с опцией for read only with rs и получаете SQLCODE -911, если запускаете этот селект одновременно из разных соединений? Такого не может быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 12:43 |
|
||
|
Как заблокировать только первую запись из селекта?
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein Т.е. вы используете вышеприведенный select с опцией for read only with rs и получаете SQLCODE -911, если запускаете этот селект одновременно из разных соединений? Такого не может быть. Нет конечно. За вышеуказанным SELECT следует UPDATE выбранной записи. 911 получаеться когда вся транзакция commit-иться. Еще раз, при выполнении из двух потоков (threads), без USE AND KEEP UPDATE LOCKS первый SELECT и следующий UPDATE будет выполнен сразу в двух транзакциях и только при commit один из потоков получит 911 ошибку. При наличии UPDATE LOCKS, вторая транзакция остановиться на SELECT и будет ждать когда выполниться COMMIT первой. Для полноты картины скажу что у меня на Сonnection to DB TX ISLN LVL set to RR or RS Кстати вот текущая версия этого select Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 17:52 |
|
||
|
Как заблокировать только первую запись из селекта?
|
|||
|---|---|---|---|
|
#18+
Вопрос можно?.... А зачем в обоих сессиях совершать какие-то телодвижения, если одна из сессий все равно откатится?.... Честно говоря из всего того что вы тут понаписали - нифига не понятно... И зачем делать select перед update?.... можно и без этого лишнего движения обойтись... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 19:05 |
|
||
|
Как заблокировать только первую запись из селекта?
|
|||
|---|---|---|---|
|
#18+
gardenmanВопрос можно?.... А зачем в обоих сессиях совершать какие-то телодвижения, если одна из сессий все равно откатится?.... Честно говоря из всего того что вы тут понаписали - нифига не понятно... И зачем делать select перед update?.... можно и без этого лишнего движения обойтись... Делаеться SELECT данные уходят наверх (Java) на их основе там делаються вычесления (упрощенно qty=qty+1, потом делаеться UPDATE на новые значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 19:09 |
|
||
|
Как заблокировать только первую запись из селекта?
|
|||
|---|---|---|---|
|
#18+
Maxim RagozinЗа вышеуказанным SELECT следует UPDATE выбранной записи. 911 получаеться когда вся транзакция commit-иться. -911 на операции commit в DB2? Это очень странно, ИМХО такого просто не может быть. -911 вы можете получить на select или update, но не на commit. Что у вас за версия DB2? Какой reason code у ошибки? Есть ли индексы? Если v8, то какого типа? По коду: Код: plaintext и что, это требование приложения такое, блокировать все строки Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 19:42 |
|
||
|
Как заблокировать только первую запись из селекта?
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein По коду: Код: plaintext Собственно это мне и надо заблокировать для последующего update-а последнюю из отсортированных по дате записей. В двух словах что я делаею так это сортирую по дате и выбираю most recent/первую. Mark Barinstein и что, это требование приложения такое, блокировать все строки Код: plaintext Собственно вопрос из приведенного выше SQL будет ли блокироваться все рекордс (внутренний SELECT position) или только одна (where rownumber_ <= 1)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 20:11 |
|
||
|
Как заблокировать только первую запись из селекта?
|
|||
|---|---|---|---|
|
#18+
С уровнем изоляции СS блокируется одна строка С уровнем изоляции RS блокируются все извлеченные строки. Ошибка 911 имеет reason code, который позволяет определить что у тебя произовшло deadlock reason code 2 lock timeout resson code 68 Так что сначало надо посмотреть на db2 get db cfg for DBASE | grep locktimeout или что у тебя на уровне приложения выставлено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 21:05 |
|
||
|
Как заблокировать только первую запись из селекта?
|
|||
|---|---|---|---|
|
#18+
Nikolay KulikovС уровнем изоляции СS блокируется одна строка С уровнем изоляции RS блокируются все извлеченные строки. Это такая фича DB2 что блокировать то она блокирует, но вот узнаю я о том что что-то не так только при коммите? Пока только WITH RS/RR USE AND KEEP UPDATE LOCKS работает как мне надо, т.е приостанавливает другой select до освобождения записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 23:31 |
|
||
|
Как заблокировать только первую запись из селекта?
|
|||
|---|---|---|---|
|
#18+
да просто не дает наложить блокировку, и вторая транзакция замирает на время timeout. А вообще-то какой вопрос - ткой ответ. Дикая ветка по понятливости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2006, 09:11 |
|
||
|
Как заблокировать только первую запись из селекта?
|
|||
|---|---|---|---|
|
#18+
Maxim RagozinСобственно это мне и надо заблокировать для последующего update-а последнюю из отсортированных по дате записей. В двух словах что я делаею так это сортирую по дате и выбираю most recent/первую. rownumber нумерует строки в порядке, указанном в over. Ей абсолютно все равно, что указано в ORDER BY селекта, в котором она используется. В ORDER BY сабселекта в вашем случае вы можете указать что угодно, результат от этого не изменится. А вообще я бы сделал так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2006, 10:09 |
|
||
|
Как заблокировать только первую запись из селекта?
|
|||
|---|---|---|---|
|
#18+
Ты объясняешь, что у тебя за проблема и эта проблема потому, что DB2 работает не так как Oracle. Объясни целиком чего ты хочешь достичь. Возможно это можно решить другим эквивалентным образом. Опять же не факт что у тебя deadlock'ки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2006, 10:23 |
|
||
|
Как заблокировать только первую запись из селекта?
|
|||
|---|---|---|---|
|
#18+
Еще маленькое уточнение... если вы юзаете select with cs то нужно это делать в курсоре, причем обязательно!.. В противном случае после селекта блокировка снимется и тогда другой юзер - делай что хошь. Если правильно подходить, то не нужен никакой RS или RR. Нужно всего лишь: DECLARE CURSOR С1... FOR SELECT ... FOR UPDATE ... WITH CS OPEN С1 FETCH C1 INTO... -- строка заблокируется -- делаем всякие вычисления и т.к. строка не нужна пропускаем ее FETCH C1 INTO... -- блокировка предыдущей строки снимется, а новая строка заблокируется -- делаем всякие вычисления и если строка нам пожходит UPDATE ... WHERE CURRENT OF C1 -- обновленная строка будет блокирована до тех пор, пока не закоммитим или не откатим транзакцию COMMIT - снимем блокировки. Вот и всё. Нафиг не нужен RR/RS... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2006, 13:12 |
|
||
|
Как заблокировать только первую запись из селекта?
|
|||
|---|---|---|---|
|
#18+
Mark Barinsteinrownumber нумерует строки в порядке, указанном в over. Ей абсолютно все равно, что указано в ORDER BY селекта, в котором она используется. В ORDER BY сабселекта в вашем случае вы можете указать что угодно, результат от этого не изменится. А где найти описание этой over() в документации? В каком хоть разделе? Search ничего не выдаёт. http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp Mark Barinstein А вообще я бы сделал так: Все вызовы делаються через JDBC, точнее Hibernate 3.2 и JDBC. Курсоры мне не доступны, точно как и CS как Isolation Level (в JDBC эквивалента нет). Stop Proc - зло :) Поэтому, похоже что выбрать последнюю запись с автоматической её блокировкой не судьба. Work around будет выбор последней без блокировки, потом следующим селектом блокировка записи (ID я уже буду знать), ну и последующий update. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2006, 17:37 |
|
||
|
Как заблокировать только первую запись из селекта?
|
|||
|---|---|---|---|
|
#18+
Maxim RagozinВсе вызовы делаються через JDBC, точнее Hibernate 3.2 и JDBC. Курсоры мне не доступны, точно как и CS как Isolation Level (в JDBC эквивалента нет). Я не знаком с Hibernate. А что, я там не могу явно указать текст запроса, как обычно в яве: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Connection.TRANSACTION_READ_COMMITTED - эквивалент CS. Про OLAP functions http://publib.boulder.ibm.com/infocenter/db2luw/v8//topic/com.ibm.db2.udb.doc/admin/r0000736.htm#olapfunc ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2006, 18:01 |
|
||
|
|

start [/forum/topic.php?fid=43&gotonew=1&tid=1605246]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
12ms |
get first new msg: |
6ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 266ms |
| total: | 438ms |

| 0 / 0 |
