powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / О блокировках
25 сообщений из 27, страница 1 из 2
О блокировках
    #33589069
Кутх
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть следующая тема.
Имеется некоторая таблица Tbl:
ParentID, Fld1,...,Fldn
Например, со следующими значениями:
1 , v11,...,v1n
2 , v21,...,v2n
2 , v31,...,v3n
3 , v41,...,v4n
3 , v51,...,v5n
...

Начинаем транзакцию.
Создаем временную таблицу Tmp (RowNumber, ParentID, Fld1,...,Fldn)
Заполняем ее:
INSERT INTO tmp
SELECT ROW_NUMBER () OVER (), Tbl.* FROM Tbl WHERE ParentID = 2
(2 - взято для примера)

Далее пользователь на свое усмотрение изголяется над этой временной таблицей, т.е. добавляет, изменяет, удаляет.

В завершение транзакции следует залить Tmp в Tbl с помощью MERGE по ParentID и RowNumber.
После этого с легким сердцем сделать COMMIT.

Вопрос, собственно не в механизме - здесь все ясно. Вопрос в следующем:
как сделать так, чтобы запрос "SELECT ROW_NUMBER () OVER (), Tbl.* FROM Tbl WHERE ParentID = 2" возвращал по любому одинаковый результат, как в начале транзакции, так и непосредственно в момент слияния, т.е. задать явно или неявно такую блокировочку, которая не даст другому юзеру в таблице Tbl:
1. изменить записи с ParentID = 2
2. удалить записи с ParentID = 2
3. добавить записи с ParentID = 2
и при этом позволит делать все что угодно с записями, где ParentID <> 2 ?
С изменением и удалением все ясно (помогает FOR UPDATE), а вот что делать с добавлением непонятно.
...
Рейтинг: 0 / 0
О блокировках
    #33589082
Nikolay Kulikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем??? У тебя на Tbl нет что-ли первичного ключа???
...
Рейтинг: 0 / 0
О блокировках
    #33589108
Кутх
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть ключ - нет ключа, это, я вам скажу, отношения к делу не имеет. Вопрос
был о блокировках. Зачем? - Надо...
...
Рейтинг: 0 / 0
О блокировках
    #33589179
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
Надо - святое дело.
Тогда вам в оффициальную документацию, на Information Center, ссылок здесь много давали.
Потому как доку читать тоже НАДО.
Зачем? Так НАДО же.
...
Рейтинг: 0 / 0
О блокировках
    #33589183
Nikolay Kulikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
другие пользователи должны иметь доступ к этим данным?
...
Рейтинг: 0 / 0
О блокировках
    #33589198
Кутх
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну то, что написано в документации я почитал до того как стал вам задавать вопросы... Конкретнее, есть что нибудь?
...
Рейтинг: 0 / 0
О блокировках
    #33589209
Кутх
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Nikolay Kulikov

Да доступ должен быть, но только на чтение.
...
Рейтинг: 0 / 0
О блокировках
    #33589214
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
Читал???
"Не верю!" (с) Станиславский.
Просмотрел - жругое дело
...
Рейтинг: 0 / 0
О блокировках
    #33589242
Кутх
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To ggv

Просьба не хамить. Если вы читали доки основательнее - подскажите мне убогому, что надо делать. А трепаться по пусту каждый мастер...
...
Рейтинг: 0 / 0
О блокировках
    #33589250
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Единственное что приходит на ум - писать в некое поле в таблице Tbl некоторое значение ассоциирующееся с текущей сессией (при оспобождении - обNULLяем). Ну, и затем проверять, существует такая сессия или нет - если существует - то можно знач удалять добавлять и проч.

Кстати, to Nikolay Kulikov, собираются ли IBM сделать триггеры на Connect/Disconnect ? Потомошто надо иногда...
...
Рейтинг: 0 / 0
О блокировках
    #33589277
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Формальный ответ - задать уровень изоляции Repeatable Read
http://publib.boulder.ibm.com/infocenter/db2luw/v8/topic/com.ibm.db2.udb.doc/admin/c0007870.htm
...
Рейтинг: 0 / 0
О блокировках
    #33589323
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
Да весь раздел "Concurrency, isolation levels, and locking" надо читать.
...
Рейтинг: 0 / 0
О блокировках
    #33589327
Кутх
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Victor Metelitsa

С Repeatable Read есть проблемы. Задавать этот уровень изоляции для всей БД низя ибо слишком жестко. А если пишешь в select ... with rr - блокируются и все отсальные записи (где ParentID иной), хотя таблица была создана с LOCKSIZE ROW.

To gardenman
Круто загнуто... Но все же надо попробовать воспользоваться стандартными механизмами.
...
Рейтинг: 0 / 0
О блокировках
    #33589358
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего крутого. Обыкновенная логическая блокировка. Можно механизм даже улучшить. Способов - много.
...
Рейтинг: 0 / 0
О блокировках
    #33589375
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уровень изоляции задаётся не для "всей БД", а для коннекта. Да, RR - это очень жёстко, но официальный ответ именно такой, коли вам надо, чтобы записи не вставились. Попробуйте для parentId создать индекс - это может помочь.
...
Рейтинг: 0 / 0
О блокировках
    #33589493
Кутх
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Индекс на ParentID имеется. А насчет уровня изоляции на сессию - не пробовал - надо посмотреть...
...
Рейтинг: 0 / 0
О блокировках
    #33589529
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использовать RR чтобы обеспечить непротиворечивость UI - это слишком. ИМХО. Причем это platform independent. По хорошему нужно смотреть на бизнеслогику + юзать set timeout no wait.
...
Рейтинг: 0 / 0
О блокировках
    #33589539
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, или перечислить в индексе все колонки, начиная с RowNumber:

create index ... (RowNumber, ParentID, Fld1,...,Fldn)

Короче, если оптимизатор решит, что этим индексом нужно пользоваться, то в нашем случае на уровне изоляции RR дело будет в шляпе (чтобы блокировались не отдельные строчки, а предикат).
...
Рейтинг: 0 / 0
О блокировках
    #33589593
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересен также вариант с MDC по parentId и LOCKSIZE BLOCKINSERT. Но, наверное, в нашем случае это будет чрезвычайно неэффективно по дисковому пространству, с неизбежными следствиями.
...
Рейтинг: 0 / 0
О блокировках
    #33589614
Nikolay Kulikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати если скомбинировать решение от gardenmana и
select from update то получится неплохо...

что-то типа
Код: plaintext
1.
2.
insert into temp_table 
select rownum(),* from old table (update tbl set app_id=applications where parentid= 2 )

А когда делаем МЕRGE обнудяем app_id


Опять же вопрос зависит от того нужно другим приложениям доступ к этим таблица м и какой
...
Рейтинг: 0 / 0
О блокировках
    #33589654
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor MetelitsaНу, или перечислить в индексе все колонки, начиная с RowNumber:

create index ... (RowNumber, ParentID, Fld1,...,Fldn)

Короче, если оптимизатор решит, что этим индексом нужно пользоваться, то в нашем случае на уровне изоляции RR дело будет в шляпе (чтобы блокировались не отдельные строчки, а предикат).
Глюк. Имелось в виду - с ParentID.
create index ... tbl(ParentID, Fld1,...,Fldn)
...
Рейтинг: 0 / 0
О блокировках
    #33589712
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nikolay KulikovКстати если скомбинировать решение от gardenmana и
select from update то получится неплохо...

Не получится. Задумайтесь над вариантом, когда данного parentId в tbl нет и два юзера одновременно хотят вставить записи.

Если же записи есть, то SELECT FOR UPDATE делает ненужным присваивание app_id.

Если уж на то пошло, записям, соотвествующим parentId (даже если это множество пусто), должно соответствовать некое ключевое id в некоей таблице, и можно выполнять select ... from некаятаблица where id=? for update

Использование ROW_NUMBER () OVER (), да, "очаровательно".
...
Рейтинг: 0 / 0
О блокировках
    #33590059
Nikolay Kulikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда они хотят его вставить это момент MERGE на нем и выставлять нужный уровень изоляции, а не держать блокировки все время...

Задача не понятна, возможно есть другие условия решения.
...
Рейтинг: 0 / 0
О блокировках
    #33590083
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
а задачу и нельзя нам понять.
Ясно только, что "надо".
...
Рейтинг: 0 / 0
О блокировках
    #33590320
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Редактируем дерево и пытаемся блокировать узел от вмешательства других пользователей. Логичнее мне кажется блокировать сам узел, а не его потомков. Быть может, app_id всё же стоит добавить. При этом, когда читаем список узлов, читаем select... with ur, и где app_id не пустой, подсвечиваем в GUI красным цветом. При редактировании делаем сперва select ... for update, установив lockwait на 0 (чтобы отбрасывало сразу с ошибкой, если уже редактирует кто-то другой). Если какая-то программа отвалилась по ошибке, rollback вернёт app_id на место - в пустое состояние. Ещё может иметь смысл поле "версия", увеличивающееся на 1 после каждого успешного редактирования, или timestamp этого успешного редактирования. Для чего нужно копировать данные (потомки узла) во временную таблицу, это загадка. Наверное, Smalltalk меня слишком избаловал, а вот бедным Java/Delphi/VS-программёрам приходится так мучаться.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / О блокировках
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]