gpt4 book ai didi

firebird - 死锁更新与并发更新冲突

转载 作者:行者123 更新时间:2023-12-02 00:18:15 24 4
gpt4 key购买 nike

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

那么,为什么我们会超时?它不应该等待一个事务被提交来提交下一个事务吗?

最佳答案

当多个事务想要修改同一行时,会发生“死锁更新与并发更新冲突”。只有一个更新程序可以真正更改行并提交。只要第一个事务尚未提交,第二个事务中的更新就会等待(无限期或直到配置的超时)。一旦第一个事务提交,第二个事务中的更新将以此错误结束(如果第一个事务回滚,第二个事务将继续)。

如果最近开始出现这种情况,您需要确定发生了什么变化。另一个工具是否也开始写入数据库,用户数量是否增加,您是否升级了某些东西(例如 Firebird 或 Firebird ado.net 提供程序版本等),您是否进行了导致长时间运行的事务执行更新的更改?

您的应用程序代码需要更改为自动重试此错误。还要确保您的交易在时间上不会太“长”(交易时间越长,发生此类错误的可能性就越大)。此外,您可以尝试将事务行为从 FbTransactionBehavior.RecVersion 更改为 FbTransactionBehavior.NoRecVersion,但这会在读取当前由并发事务更新的记录时引入等待,如果记录由具有较新事务 ID 的事务更新(和提交),它实际上可能会增加更新冲突的发生。

另见 http://www.firebirdfaq.org/faq151/ , Transactions in Firebird: ACID, Isolation levels, Deadlocks, and Resolution of update conflictsTransaction Statements .

关于firebird - 死锁更新与并发更新冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56335663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com