Как заблокировать строку для обновления в Ibm Db2 без таймаутов? - PullRequest
0 голосов
/ 23 октября 2018

Мне нужно обновить одну строку для каждого соединения в ibm db2 на zos без аномалий данных.

Я выбираю FOR UPDATE WITH RS USE и KEEP, но есть проблема.Если один клиент удерживает блокировку во время обновления данных и одновременно второй пользователь пытается прочитать ту же строку - второй пользователь будет ждать, пока не будет снята блокировка.

Мне нужно следующее поведение: второй пользователь получает ошибку, если строка находится под блокировкой.

Возможно ли это в DB2 11?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

При длительном обновлении одной записи, возможно, лучше просто прочитать запись, включая метку времени, а затем обработать другие записи.Когда будете готовы к обновлению, прочитайте для обновления, и если отметка времени не изменилась, обновите запись.Покажите ошибку, если метка времени была изменена.

0 голосов
/ 23 октября 2018

То, что вы запрашиваете, - это условный SELECT, если вы можете получить блокировку UPDATE, если я правильно читаю ваш запрос.Я не верю, что есть способ сделать это.Однако в качестве альтернативы вы можете сделать что-то вроде:

SELECT myCount FROM myTable WHERE ID = someValue

Затем вы можете обновить значение и выполнить UPDATE с предложением WHERE, которое ищет идентификатор и исходное значение myCount,Последовательность, подобная

SELECT myCount FROM myTable WHERE ID = someValue
origCount = myCount++
UPDATE myTable WHERE ID = someValue AND myCount = origValue

Если ваше ОБНОВЛЕНИЕ показывает, что обновлено ноль строк, у вас есть признак того, что кто-то еще обновил его, и затем вы повторяете последовательность или переходите к альтернативной логике.

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

Обычно это называется ОптимистичныйПараллелизм

Оптимистический контроль параллелизма (OCC) - это метод управления параллелизмом, применяемый к транзакционным системам, таким как системы управления реляционными базами данных и программная транзакционная память.OCC предполагает, что несколько транзакций могут часто завершаться, не мешая друг другу.Во время выполнения транзакции используют ресурсы данных без получения блокировок этих ресурсов.Перед фиксацией каждая транзакция проверяет, что никакая другая транзакция не изменила прочитанные данные.Если проверка выявляет конфликтующие изменения, транзакция принятия отменяется и может быть перезапущена. [1]Оптимистическое управление параллелизмом было впервые предложено Х. Т. Кунгом и Джоном Т. Робинсоном

...