firebird - конфликт тупиковых обновлений с одновременным обновлением - PullRequest
0 голосов
/ 28 мая 2019

Я поддерживаю старое программное обеспечение (Firebird 2.5 и C # .net).В последнее время мы получаем много ошибок «тупиковые конфликты обновления с одновременным обновлением».Я проверил настройки транзакции.Он не устанавливает параметр времени ожидания:

public override IDbTransaction BeginTransaction(IDbConnection conn)
{
    FbTransaction trans = null;

    if (conn.State != ConnectionState.Open)
        conn.Open();

    FbTransactionOptions op = new FbTransactionOptions();
    op.TransactionBehavior = FbTransactionBehavior.ReadCommitted | FbTransactionBehavior.RecVersion;

    trans = ((FbConnection)conn).BeginTransaction(op);

    return trans;
}

Итак, почему мы получаем тайм-аут?Разве он не должен ждать, пока одна транзакция будет зафиксирована, чтобы зафиксировать следующую?

1 Ответ

1 голос
/ 28 мая 2019

«Обновление тупиковой ситуации конфликтует с одновременным обновлением», когда несколько транзакций хотят изменить одну и ту же строку.Только один апдейтер может действительно изменить строку и зафиксировать.Пока первая транзакция не зафиксирована, обновление во второй транзакции будет ожидать (неопределенно или до установленного времени ожидания).Как только первая транзакция будет зафиксирована, обновление во второй транзакции завершится с этой ошибкой (если вместо этого первая транзакция откатилась, вторая продолжила бы).

Если это началось недавно, вам нужноопределить, что изменилось.Другой инструмент также начал запись в базу данных, увеличилось ли количество пользователей, обновили ли вы что-то (например, Firebird, или версию поставщика Firebird ado.net и т. Д.), Вы внесли изменение, которое привело к длительным транзакциям, выполняющим обновления??

Необходимо изменить код вашего приложения, чтобы автоматически повторить эту ошибку.Также убедитесь, что ваши транзакции не слишком «длинные» по времени (чем длиннее транзакции, тем больше вероятность возникновения ошибок такого типа).Кроме того, вы можете попытаться изменить поведение транзакции с FbTransactionBehavior.RecVersion на FbTransactionBehavior.NoRecVersion, но это может привести к ожиданию при чтении записей, которые в данный момент обновляются параллельными транзакциями, и может фактически увеличить возникновение конфликтов обновления, если запись была обновлена.(и совершено) транзакцией с более новым идентификатором транзакции.

См. также http://www.firebirdfaq.org/faq151/, Транзакции в Firebird: ACID, уровни изоляции, тупики и разрешение конфликтов обновления и Заявления о транзакциях .

...