с уровнем изоляции = serializable будет Postgres автоматически перезапустить неудачную транзакцию, или я должен сделать это сам - PullRequest
0 голосов
/ 30 ноября 2018

Я запускаю хранимую процедуру, которая идет

....
select xxxx
if xxxx !found 
   insert xxxxx
do stuff with xxx
...

, очевидно, здесь есть гонка.Мое наивное ожидание состояло в том, что, если я правильно установлю уровень изоляции транзакции (сериализуемый), тогда гонка будет автоматически решена (через прозрачный перезапуск, как другие системы БД, с которыми я работал).Кажется, это не так.

Я думаю, что должен сам обнаружить ошибку 40001 и повторно отправить неудачную транзакцию.

Это правильно?Могу ли я где-нибудь установить флаги, чтобы сказать: «Пожалуйста, сделай это волшебством»?

1 Ответ

0 голосов
/ 01 декабря 2018

Да, вы должны обнаружить SQLSTATE 40001 и повторить транзакцию самостоятельно.

База данных не имеет доступа ко всей информации, необходимой для повторения транзакции.В журнале транзакций хранятся физические изменения, внесенные в базу данных, а не операторы SQL.

И если это была длинная транзакция и была контрольная точка с момента ее запуска, PostgreSQL может даже больше не иметь журнал транзакций.

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