僵局更新与并发更新发生冲突



我正在维护旧软件(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;
}

那么,我们为什么要超时?不应该等待一项交易提交下一个交易吗?

a deadlock更新与并发更新相冲突。当多个事务想修改同一行时发生。只有一个更新者可以真正改变行并提交。只要第一个事务尚未提交,第二笔交易中的更新将等待(无限期或直到配置的超时为止(。第一笔交易提交后,第二笔交易中的更新将以此错误结束(如果第一个交易已退回,则第二笔交易将继续(。

如果最近开始发生这种情况,则需要确定变化的内容。还有另一个工具还开始写入数据库,用户数量增加了吗,您是否升级了某些内容(例如Firebird或Firebird ado.net提供商版本等(,您是否进行了更改,导致长期运行的交易执行更新?

您的应用程序代码将需要更改以在此错误上自动重试。另外,请确保您的交易不太"太长"时间(交易的时间越长,发生这些类型的错误的机会就越多(。此外,您可以尝试将交易行为从FbTransactionBehavior.RecVersion更改为FbTransactionBehavior.NoRecVersion,但是在阅读当前通过并发交易更新的记录时,这可以引入等待,并且如果记录已更新(并承诺(,则实际上可能会增加更新冲突的发生。通过具有较新事务ID的交易。

另请参见http://www.firebirdfaq.org/faq151/,Firebird中的交易:酸,隔离水平,僵局,并解决更新冲突和交易声明。

最新更新