В DB2 выбранная изоляция строк не работает - PullRequest
0 голосов
/ 21 мая 2018

по этой ссылке Я должен иметь возможность isolate rows, которые читаются с помощью оператора select, но когда я выполняю шаги ниже, он не блокирует строки

  1. create table test ( col varchar(50));
  2. INSERT INTO test values('100');
  3. select COL from mdmsysdb.test WITH RS USE AND KEEP EXCLUSIVE LOCKS или
    select COL from mdmsysdb.test WITH RR USE AND KEEP EXCLUSIVE LOCKS
  4. в параллельном приложении, когда я запускаю оператор обновления, он выходитправильно.

Что не так с моим подходом, почему строка обновляется на шаге 4 из параллельного приложения, когда определено, что выборка содержит исключительную блокировку?

1 Ответ

0 голосов
/ 22 мая 2018

Если вы используете RHEL и запускаете операторы SQL в командной строке оболочки (bash или ksh и т. Д.).тогда вам нужно понять поведение автокоммитов по умолчанию.

Позаботьтесь об использовании правильного синтаксиса SQL для версии и платформы Db2-сервера.Они различаются между Linux / Unix / Windows и i-Series и Z / OS.Каждая платформа может вести себя по-разному, и разные настройки для каждой платформы могут регулировать поведение блокировки.

Db2 CLP в Windows / Linux / Unix будет автоматически фиксироваться по умолчанию.Таким образом, любые блокировки, принятые оператором, немедленно снимаются при завершении оператора, когда происходит автоматическое принятие.Это объясняет, почему (в разных сеансах) вы не можете заставить ждать блокировки - блокировка уже снята!

Таким образом, наблюдаемое поведение правильное - работает так, как задумано, а не то, что вы неправильно вообразили.Вы можете изменить поведение по умолчанию, выборочно отключив автокоммит.

Чтобы отключить автокоммит, у вас есть разные варианты.Вы можете сделать это в командной строке CLP, чтобы повлиять на текущую командную строку (используйте опцию + c), или вы можете использовать переменную окружения DB2OPTIONS , чтобы установить ее навсегда для сеанса (обычно плохой)идея), или вы можете включить / отключить автоматическую фиксацию «на лету» внутри скрипта с помощью команд update command options using c off; и update command options using c on;.

Чтобы отключить автоммит в командной строке Db2 CLP, только для одногооператора, затем используйте опцию + c, например:

db2 +c "select COL from mdmsysdb.test WITH RS USE AND KEEP EXCLUSIVE LOCKS"

Когда вы отключите автокоммит, вы несете ответственность за выполнение явного подтверждения или отката.Если вы использовали опцию + c, любая команда db2, которая опускает эту опцию, вернется к поведению по умолчанию или к DB2OPTIONS, если она установлена.Таким образом, вы должны знать, что вы делаете, и тщательно проверять.

...