|
|
|
еще раз возвращаемся к теме блокировок
|
|||
|---|---|---|---|
|
#18+
Тут колеги по цеху решают интересную задачу Select for update - как получить незаблокированные данные Давайте поделимся опытом как такую задачу решить в Informix я себе это представляю так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. Все очень просто. Может у кого есть другие идеии или коментарии? з.ы. - А зачем нужна версионность? - Что бы решать проблемы блокировок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2006, 22:41 |
|
||
|
еще раз возвращаемся к теме блокировок
|
|||
|---|---|---|---|
|
#18+
Это не UPDATE CURSOR Если я правильно понял автора,- проблема в том что UPDATE CURSOR ставит EXCLUSIVE LOCK на измененные записи (а если lock mode page...) и нужно выполнить другое приложение с таким же курсором. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2006, 12:37 |
|
||
|
еще раз возвращаемся к теме блокировок
|
|||
|---|---|---|---|
|
#18+
QuasimodoЭто не UPDATE CURSOR Если я правильно понял автора,- проблема в том что UPDATE CURSOR ставит EXCLUSIVE LOCK на измененные записи (а если lock mode page...) и нужно выполнить другое приложение с таким же курсором. По мему автор говрил о том как можно несколькими сессиями обработать необходимые записи, так что бы они друг друга не блокировали, и никакая из них не была бы обработана дважды. А update cursor это только(просто) инструмент в данном случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2006, 13:25 |
|
||
|
еще раз возвращаемся к теме блокировок
|
|||
|---|---|---|---|
|
#18+
хм .. информикс разве не блокировочник ? селект/cursor обоих сесий понаставит shared блокировки на одни и те же записи и следом пойдет "критический к ошибкам блок" на одну и ту же запись т.е. муйня получится ... разве не так ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2006, 15:49 |
|
||
|
еще раз возвращаемся к теме блокировок
|
|||
|---|---|---|---|
|
#18+
Desperadoхм .. информикс разве не блокировочник ? селект/cursor обоих сесий понаставит shared блокировки на одни и те же записи и следом пойдет "критический к ошибкам блок" на одну и ту же запись т.е. муйня получится ... разве не так ? Да он блокировочник. Блокировка будет установлена только на одну запись, которая в текущий момент выбрана курсором в переменные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2006, 10:14 |
|
||
|
еще раз возвращаемся к теме блокировок
|
|||
|---|---|---|---|
|
#18+
onstat- Да он блокировочник. Блокировка будет установлена только на одну запись, которая в текущий момент выбрана курсором в переменные. как так ? это на каком уровне изоляции (и какой у информикса дефолтный) ? если ставить блокировки по одной то получается, что курсор получит неконсистентный набор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2006, 11:53 |
|
||
|
еще раз возвращаемся к теме блокировок
|
|||
|---|---|---|---|
|
#18+
Desperado onstat- Да он блокировочник. Блокировка будет установлена только на одну запись, которая в текущий момент выбрана курсором в переменные. как так ? это на каком уровне изоляции (и какой у информикса дефолтный) ? если ставить блокировки по одной то получается, что курсор получит неконсистентный набор. Курсор получит консистентный набор по состоянию на время доступа к записи а не на время начала foreach. Если Вы считете это неправильным для данной задачи, обьясните почему? Может я что-то недопонимаю. По умолчанию уровень изоляции read commited. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2006, 12:38 |
|
||
|
еще раз возвращаемся к теме блокировок
|
|||
|---|---|---|---|
|
#18+
onstat- Курсор получит консистентный набор по состоянию на время доступа к записи а не на время начала foreach. набор чего, полей у одной записи ? мне казалось курсор оперирует набором записей . onstat- Если Вы считете это неправильным для данной задачи, обьясните почему? Может я что-то недопонимаю. думаю вы сильно ошибаетесь, что курсор не наложит блокировки (хотябы shared) на все записи набора, иначе я не представляю как такое работает. допустим курсор выбрал какой-то набор и заблокировал одну запись, сделал одну итерацию, теперь из этого набора пару записей ушла (updated/deleted) чать пришла и что теперь курсору делать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2006, 13:10 |
|
||
|
еще раз возвращаемся к теме блокировок
|
|||
|---|---|---|---|
|
#18+
Desperado onstat- Курсор получит консистентный набор по состоянию на время доступа к записи а не на время начала foreach. набор чего, полей у одной записи ? мне казалось курсор оперирует набором записей . Крусор оперирует набором записей заданным условием where. Если вас смущает вопрос транзакционой целостности посмотрите где начинается и заканчивается транзакция в моем примере. Desperado onstat- Если Вы считете это неправильным для данной задачи, обьясните почему? Может я что-то недопонимаю. думаю вы сильно ошибаетесь, что курсор не наложит блокировки (хотябы shared) на все записи набора, иначе я не представляю как такое работает. допустим курсор выбрал какой-то набор и заблокировал одну запись, сделал одну итерацию, теперь из этого набора пару записей ушла (updated/deleted) чать пришла и что теперь курсору делать ? IBM infromix guide to SQL sysnax It is possible to declare an update cursor with the WITH HOLD keywords, but the only reason to do so is to break a long series of updates into smaller transactions. You must fetch and update a particular row in the same transaction. If an operation involves fetching and updating a large number of rows, the lock table that the database server maintains can overflow. The usual way to prevent this overflow is to lock the entire table that is being updated. If this action is impossible, an alternative is to update through a hold cursor and to execute COMMIT WORK at frequent intervals. You must plan such an application carefully, however, because COMMIT WORK releases all locks, even those that are placed through a hold cursor. commit отпустит все блокировки набранные после обработки любой записи из курсора. Я предложил пользоватся механизмом with hold для разрешения проблемы. Если вы видите какие либо ограничения informix в этом направлении, скажите. А на пустые теоретизирования вокруг даной проблемы у меня нет времени . Я похожую прикладную задачу уже решил именно таким образом. Вы можете предложить свой другой вариант решения. Думаю всем будет интересно. C уважением, onstat ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2006, 14:33 |
|
||
|
еще раз возвращаемся к теме блокировок
|
|||
|---|---|---|---|
|
#18+
да, незаметил with hold. но все равно с паралельными процессами ерунда получается: первый процесс (with hold) наложит блокировки на весь набор (второй пока будет ждать снятия этих блокировок), после фетча первой записи первый процесс делает комит и снимает все локи, теперь пролезает второй процесс поставит лок на весь набор, фетчит запись и комитит снимая блокировки. в результате 2 конкурирующих процесса с одинаковым набором в курсорах которые друг другу только мешают. да и что полдучается если курсор фетчит запись котороя была изменена и не должна теперь попасть в набор (т.е. первый обработал, а второй ее же зафетчил) мне из документации выяснить не удалось. ЗЫ. если у вас нет время, то думаю вам не стоит беспокоится, мне тут ответят другие ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2006, 15:45 |
|
||
|
еще раз возвращаемся к теме блокировок
|
|||
|---|---|---|---|
|
#18+
Позволю себе цитату на тему update cursor : ------------- An update cursor is a special kind of cursor that applications can use when the row might potentially be updated. To use an update cursor, execute SELECT FOR UPDATE in your application. Update cursors use promotable locks; that is, the database server places an update lock (meaning other users can still view the row) on the row when the application fetches the row, but the lock is changed to an exclusive lock when the application uses an update cursor and UPDATE...WHERE CURRENT OF to update the row. The advantage of an update cursor is that you can view the row with the confidence that other users cannot change it or view it with an update cursor while you are viewing it and before you update it. If you do not update the row, the default behavior of the database server is to release the update lock when you execute the next FETCH statement or close the cursor. However, if you execute the SET ISOLATION statement with the RETAIN UPDATE LOCKS clause, the database server does not release any currently existing or subsequently placed update locks until the end of the transaction. The pseudocode in Figure 37 shows when the database server places and releases update locks with a cursor. At fetch row 1, the database server places an update lock on row 1. At fetch row 2, the server releases the update lock on row 1 and places an update lock on row 2. However, after the database server executes the SET ISOLATION statement with the RETAIN UPDATE LOCKS clause, it does not release any update locks until the end of the transaction. At fetch row 3, it places an update lock on row 3. At fetch row 4, it places an update lock on row 4. At commit work, the server releases the update locks for rows 2, 3, and 4. Figure 37. When Update Locks Are Released declare update cursor begin work open the cursor fetch row 1 fetch row 2 SET ISOLATION TO COMMITTED READ RETAIN UPDATE LOCKS fetch row 3 fetch row 4 commit work --------------- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2006, 15:52 |
|
||
|
|

start [/forum/topic.php?fid=44&msg=33561964&tid=1608731]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
| others: | 226ms |
| total: | 393ms |

| 0 / 0 |
