powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Как красиво решить проблему с тупиковой ситуацией
9 сообщений из 9, страница 1 из 1
Как красиво решить проблему с тупиковой ситуацией
    #34924644
dealko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Транзакция выглядит так:
Код: plaintext
select id from final table (insert into TABLE1 TICKETID,PUNTERID values(?,?));
Потом несколько раз выполняется :
Код: plaintext
select id from final table (insert into table2 (BETID,SELECTIONID) values (?,?));
Потом происходит апдейт блоба в первой таблице, куда нужно записать ID новых записей первой и второй таблицы:
Код: plaintext
UPDATE table1 set value=? where id=?;

Как написано в мануале решение такое - Использовать условие FOR UPDATE OF при выполнении операции выбора.

Какие ещё возможны варианты ? Как я понимаю лучше переписать транзакцию в виде одного оператора, чтобы уменьшить кол-во операций IO, кол-во операторов. Тогда работать будет быстрее и тупиковых ситуаций не будет. Только не могу понять как.

Может кто подскажет решение ?

Заранее спасибо.
...
Рейтинг: 0 / 0
Как красиво решить проблему с тупиковой ситуацией
    #34924920
dealko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Грустно получается.

FOR UPDATE OF не проходит - 0511N
WITH RS USE AND KEEP UPDATE LOCKS тоже не проходит - 0109N
...
Рейтинг: 0 / 0
Как красиво решить проблему с тупиковой ситуацией
    #34924983
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Опишите алгоритм более подробно, желательно на примере.
id - generated у обеих таблиц?
используется ли table1.id в insert в table2?
как именно выглядит значение для table1.value в update?
...
Рейтинг: 0 / 0
Как красиво решить проблему с тупиковой ситуацией
    #34925226
dealko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробую полные SQL операторы для транзакции привести.
Сначала вставляется строка:
Код: plaintext
1.
2.
3.
4.
SCRIPT = "select id from final table (insert into PANBET.BET"
                    + "(TICKETID,PUNTERID,CREATEDATE,INFO,STATE,COST,WIN,MAXWIN,STAKE,PAYOUT,SLIP,ISEW,"
                    + "PUNTERCODE,EXTERNALCODE,REMARK,ISHEDGING,SOURCE,DESCRIPTION,ISANTEPOST,"
                    + "ISFULLYHEDGED,ISLONGTERM,GRADE,USERID,ISSPECIAL) "
                    + "values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?))";
Потом несколько раз выполняется :
Код: plaintext
1.
SCRIPT = "select id from final table (insert into PANBET.BETSELECTION "
                    + "(BETID,SELECTIONID,SELECTIONUID,ISPRICEAFFECT,PRICE,MARKET,DESCRIPTION) values (?,?,?,?,?,?,?))";
При этом в поле BETID вставляется значение ID новой записи из поля таблицы BET. Т.е. связь - BET - BETSELECTION один ко многим. На уровне DB2 реляционного ограничения нет.

Потом генерится сериализованный Java объект, который включает в состав объекта полученные ранее ID для новых записей таблиц BET и BETSELECTION. Как раз этот объект и записывается в VALUE. Объект генерится с помощью собственного алгоритма сериализации. Это и есть значение поля VALUE в таблице BET.

Потом происходит апдейт блоба в таблице BET
Код: plaintext
1.
jdbc.update("UPDATE " + table + " set value=? where id=?", new Object[] {
                         new SqlLobValue(byteValue, lobHandler), id}, new int[] {getPersistanceSQLType(), Types.INTEGER});

ID в обоих таблицах GENERATED ALWAYS AS IDENTITY

Пример VALUE такой: x'1F8B08000000000000005BF39681B59C91B1B888412E393F57AF20312F29B5442F273F3D33590FC82AC9CC4BD7734A2D09F1EFFA2A72C458B9FB1B0F03434541392F030430F28388725604C55D0CE1F1C2781C420CACAEB9052595E59CDC0E2A106DE5A2420C42BE8E7EA18E3EF1018E91FEA121F13EFEC1AEE59C40D319455B2CDA7DCB191980EAA1B63080784C5C0CE5AC22601EAB284C504B8841FDD062430385102305EFCC9CDCFCBCD44A05BFCCE46C5E2E5E2E43532B230B05E7A2C4CAB4FCA214882FD5917C09640235E8256724E6A5A716EB3943688FFC9C94D4A2D4874B9C1D38C5AB21DEE58239840B6E392AC5C85857C46044A4D92ACE8925A9E9F94599A9C530738580D61431F065259625EAE50095EAB9E695E6224B169430303BB98654808381530016FCC84C6070B0F2D9373040820A844161080ED1D64A0711881B5550DC58940A7368706A625E726A707E695132AAAB0A19EA18584B18B89C1D7D7C9C5DFD42825CE1C6C330CC0EFB3B9030C6654749BE5E40517E416A5109D0E7C71A95366A1E14CA444D4F0CE0E0AC404E2AE08400E3550000A60AB390B0020000'

Этого достаточно ?

Если нет можно ещё примеры значений привести. Но из необычного только то что VALUE "особенный".
...
Рейтинг: 0 / 0
Как красиво решить проблему с тупиковой ситуацией
    #34925264
dealko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробую полные SQL операторы для транзакции привести.
Сначала вставляется строка:
Код: plaintext
1.
2.
3.
4.
SCRIPT = "select id from final table (insert into PANBET.BET"
                    + "(TICKETID,PUNTERID,CREATEDATE,INFO,STATE,COST,WIN,MAXWIN,STAKE,PAYOUT,SLIP,ISEW,"
                    + "PUNTERCODE,EXTERNALCODE,REMARK,ISHEDGING,SOURCE,DESCRIPTION,ISANTEPOST,"
                    + "ISFULLYHEDGED,ISLONGTERM,GRADE,USERID,ISSPECIAL) "
                    + "values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?))";
Потом несколько раз выполняется :
Код: plaintext
1.
SCRIPT = "select id from final table (insert into PANBET.BETSELECTION "
                    + "(BETID,SELECTIONID,SELECTIONUID,ISPRICEAFFECT,PRICE,MARKET,DESCRIPTION) values (?,?,?,?,?,?,?))";
При этом в поле BETID вставляется значение ID новой записи из поля таблицы BET. Т.е. связь - BET - BETSELECTION один ко многим. На уровне DB2 реляционного ограничения нет.

Потом генерится сериализованный Java объект, который включает в состав объекта полученные ранее ID для новых записей таблиц BET и BETSELECTION. Как раз этот объект и записывается в VALUE. Объект генерится с помощью собственного алгоритма сериализации. Это и есть значение поля VALUE в таблице BET.

Потом происходит апдейт блоба в таблице BET
Код: plaintext
1.
jdbc.update("UPDATE " + table + " set value=? where id=?", new Object[] {
                         new SqlLobValue(byteValue, lobHandler), id}, new int[] {getPersistanceSQLType(), Types.INTEGER});

ID в обоих таблицах GENERATED ALWAYS AS IDENTITY

Пример VALUE такой: x'1F8B08000000000000005BF39681B59C91B1B888412E393F57AF20312F29B5442F273F3D33590FC82AC9CC4BD7734A2D09F1EFFA2A72C458B9FB1B0F03434541392F030430F28388725604C55D0CE1F1C2781C420CACAEB9052595E59CDC0E2A106DE5A2420C42BE8E7EA18E3EF1018E91FEA121F13EFEC1AEE59C40D319455B2CDA7DCB191980EAA1B63080784C5C0CE5AC22601EAB284C504B8841FDD062430385102305EFCC9CDCFCBCD44A05BFCCE46C5E2E5E2E43532B230B05E7A2C4CAB4FCA214882FD5917C09640235E8256724E6A5A716EB3943688FFC9C94D4A2D4874B9C1D38C5AB21DEE58239840B6E392AC5C85857C46044A4D92ACE8925A9E9F94599A9C530738580D61431F065259625EAE50095EAB9E695E6224B169430303BB98654808381530016FCC84C6070B0F2D9373040820A844161080ED1D64A0711881B5550DC58940A7368706A625E726A707E695132AAAB0A19EA18584B18B89C1D7D7C9C5DFD42825CE1C6C330CC0EFB3B9030C6654749BE5E40517E416A5109D0E7C71A95366A1E14CA444D4F0CE0E0AC404E2AE08400E3550000A60AB390B0020000'

Этого достаточно ?

Если нет можно ещё примеры значений привести. Но из необычного только то что VALUE "особенный".
...
Рейтинг: 0 / 0
Как красиво решить проблему с тупиковой ситуацией
    #34925413
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 инсерта вы еще сможете в один оператор объединить, а вот все 3 - нет.
А где вы здесь дедлоки получаете в таком алгоритме?
При выполнении UPDATE?
...
Рейтинг: 0 / 0
Как красиво решить проблему с тупиковой ситуацией
    #34926572
dealko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, deadlock при выполнении update.

Но появляется очень редко. Только при нагрузочных тестах в определенной конфигурации, когда таблицы пустые. Когда в таблицах есть несколько тысяч записей, то deadlock нет.

У нас Tomcat and DB2. Dealock появляется когда и то и другое стоит на одном сервере.

Правильно ли я понял, Марк что единственным вариантом избавления от deadlock будет отказ от ID в BLOB ?

Это решение реализуемо. Правда потребуется большой рефакторинг.
...
Рейтинг: 0 / 0
Как красиво решить проблему с тупиковой ситуацией
    #34927903
DPH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DPH
Гость
Денис, привет.

А там эскалации блокировок на пустой таблице не происходит, случайно?
...
Рейтинг: 0 / 0
Как красиво решить проблему с тупиковой ситуацией
    #34929643
dealko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, Фил.

Не подумал как-то. Очень вероятно. Надо проверить. Спасиб за совет.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Как красиво решить проблему с тупиковой ситуацией
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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