Как избежать блокирования тупиками? - PullRequest
0 голосов
/ 19 октября 2018

Могу ли я написать оператор UPDATE, который просто не будет выполнять при наличии тупика?

У меня небольшая, но часто обновляемая таблица.

Этот оператор выполняется довольно частона нем ....

UPDATE table_a SET lastChangedTime = 'blah' WHERE pk = 1234;

Где pk - первичный ключ.

Время от времени это утверждение блокируется.Это само по себе не имеет большого значения;проблема в том, что каждый раз, когда происходит блокировка, Postgres, кажется, требуется одна или две минуты, чтобы разобраться в себе, и я могу потерять много данных.

table_a очень изменчив, и lastChangedTimeменяются все время, так что вместо того, чтобы иногда ждать две минуты для выполнения UPDATE, я бы предпочел, чтобы это не беспокоило.Хорошо, мои данные могут быть не такими актуальными, как хотелось бы для этой записи, но, по крайней мере, я бы не заблокировал всю таблицу на 2 минуты.


Обновление послекомментарии:

приложение очень просто взаимодействует с базой данных, оно выдает только простые, однострочные операторы UPDATE и INSERT и немедленно фиксирует каждое из них.Одна из проблем, вызывающих у меня сильное головокружение, заключается в том, как что-то может работать миллион раз без проблем, а затем просто потерпеть неудачу на другой записи, которая, похоже, идентична всем остальным.


Последнее предложение/ question ..... Оператор UPDATE вызывается из приложения C #.Если я изменю «тайм-аут команды» на очень короткое значение, скажем, 1 миллисекунда, это даст желаемый эффект?или это может привести к засорению базы данных большим количеством прерванных транзакций?

1 Ответ

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

Чтобы избежать ожидания блокировок, сначала запустите

SELECT 1 FROM table_a WHERE pk = 1234 FOR UPDATE NOWAIT;

Если в строке есть блокировка, оператор сразу же потерпит неудачу, и вы можете приступить к работе над чем-то другим.

Помните, что оператор SELECT ... FOR UPDATE должен находиться в той же транзакции базы данных, что и ваш оператор UPDATE.

В качестве общего совета вы должны использовать более короткие транзакции, которые уменьшат продолжительность ожидания блокировки ириск тупика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...