2016-09-16 5 views
0

В PostgreSQL documentation 13.2.3. Serializable Isolation Level состояния:Обобщенная обработка сбоев SQL транзакций из-за уровня изоляции сериализуемой

Очень важно, чтобы среда, которая использует эту технику, имеют обобщенный способ обработки отказов сериализации (которые всегда возвращаются со значением SQLSTATE из «40001»), потому что будет очень сложно точно предсказать, какие транзакции могут повлиять на зависимости чтения и записи, и их нужно откатить, чтобы предотвратить аномалии сериализации.

Как это просто, как всегда, повторять транзакцию, пока она не удастся? Псевдокод:

while (true) { 
    try { 
     BEGIN TRANSACTION 
     ... 
     COMMIT TRANSACTION 
    } 
    catch (SQLSTATE == '40001') { 
     continue; // retry 
    } 
    break; // succeed 
} 

Гарантировано, будет успешным в какой-то момент? Существуют ли ситуации, когда невозможно, что это когда-нибудь удастся после неудачи? Что еще может/нужно делать? Это зависит от сценария? Может быть, иногда повторные транзакции запроса тоже повторяются? В таком случае, как можно получить обобщенное решение?

Есть ли какие-либо примеры с открытым исходным кодом такого обобщенного механизма обработки? Или любые хорошие ресурсы (книги, статьи, ...), описывающие разные подходы?

ответ

1

В вашем примере кода показано, как это сделать.

Ошибки в сериализации должны происходить редко; если они этого не делают, что-то в вашей базе данных или дизайне приложения необоснованно.

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

+0

Знаете ли вы примеры с открытым исходным кодом, которые демонстрируют это? – Peter

+0

Вы отправили один в свой вопрос ... –

+0

Знаете ли вы другой пример? Или никто не использует это? – Peter

Смежные вопросы