как заблокировать таблицу в DB2 без ожидания

Я хочу заблокировать таблицу в DB2 (версия 11) и не хочу, чтобы другие люди ждали моей блокировки при попытке обновить заблокированную таблицу. (Сгенерировано исключение или возвращен код ошибки)

Я использовал следующую команду: LOCK TABLE MYTABLE IN EXCLUSIVE MODE

Но другие соединения всегда ждут.

Так есть ли способ перестать ждать?


person Dai Vu    schedule 15.05.2018    source источник
comment
Это Db2 v11 на Linux/Unix/Windows или на мейнфрейме Z/OS?   -  person mao    schedule 15.05.2018
comment
@mao: это на Linux   -  person Dai Vu    schedule 15.05.2018
comment
Вы можете контролировать свои действия, но другие приложения могут контролировать свои собственные. Они должны установить свои собственные периоды ожидания блокировки. Если вы не хотите, чтобы они ждали объект, тогда объект должен перестать существовать, как они его знают - если RENAME - это вариант для вас, это может быть лучшим маршрутом. Вы также можете просмотреть приложения, использующие представления или псевдонимы для таблицы, которые вы отбрасываете при выполнении этой операции.   -  person Rob Wilson    schedule 15.05.2018


Ответы (2)


Для Db2 в Linux/Unix/Windows: если вы используете 'LOCK TABLE... IN EXCLUSIVE MODE', тогда другие соединения будут ждать вашей фиксации/отката.

Для Db2 в Linux/Unix/Windows по умолчанию другие соединения будут ожидать либо LOCKTIMEOUT секунд (по умолчанию = -1 = ждать навсегда ) или что-то другое, настроенное другим приложением в своем соединении либо через SET CURRENT LOCK TIMEOUT ( который может включать параметр NOT WAIT или другие значения) или в конфигурации другого приложения Db2-client. См. документацию здесь.

Дополнительные сведения о параметрах конфигурации на стороне клиента (db2cli.ini, db2dsdriver.cfg, атрибуты соединения и т. д.) см. в Центре знаний Db2.

Важно понимать, что либо это другие приложения должны настроить свое время ожидания блокировки (либо в своем коде, либо в конфигурации Db2-клиента), либо параметр базы данных LOCKTIMEOUT будет определять время их ожидания. .

Короче говоря, если вы хотите, чтобы другие приложения не ждали, эти приложения должны быть запрограммированы/настроены для этой цели, или конфигурация базы данных LOCKTIMEOUT должна быть настроена соответствующим образом, или и то, и другое.

На практике это означает, что вам нужно либо избегать блокировки таблиц в эксклюзивном режиме (явно или неявно), либо вам нужно выполнять это в самое спокойное время и сохранять продолжительность блокировки как можно короче. В частности, ваша работа не может сообщить другим соединениям Db2, как настроить их поведение при ожидании блокировки!

person mao    schedule 15.05.2018
comment
извините за мой плохой опыт. Команда SET CURRENT LOCK TIMEOUT должна выполняться до или после запуска команды LOCK TABLE? Я пробовал, как показано ниже: db2 +c LOCK TABLE MYTABLE IN EXCLUSIVE MODE db2 SET CURRENT LOCK TIMEOUT NOT WAIT И другие соединения не ждут, а завершаются успешно - person Dai Vu; 16.05.2018

Может быть, другие пользователи могли бы использовать незафиксированные чтения WITH UR?

https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0059225.html

В качестве альтернативы, возможно, вы могли бы использовать IN SHARE MODE вместо блокировки EXCLUSIVE

https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000972.html

person jackic23    schedule 15.05.2018