firebird - 死锁更新与并发更新冲突
firebird - deadlock update conflicts with concurrent update
我正在维护一个旧软件(Firebird 2.5 和 C#.net)。最近我们收到很多 "deadlock update conflicts with concurrent update" 错误。我检查了交易设置。它没有设置等待超时选项:
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 提供程序版本等),您是否进行了导致长 运行 事务执行更新?
您的应用程序代码需要更改为自动重试此错误。还要确保您的交易不要太 'long' time-wise(交易时间越长,发生此类错误的可能性就越大)。此外,您可以尝试将事务行为从 FbTransactionBehavior.RecVersion
更改为 FbTransactionBehavior.NoRecVersion
,但这会在读取当前由并发事务更新的记录时引入等待,并且实际上可能会增加更新冲突的发生如果记录已由具有较新事务 ID 的事务更新(并提交)。
另见 http://www.firebirdfaq.org/faq151/, Transactions in Firebird: ACID, Isolation levels, Deadlocks, and Resolution of update conflicts and Transaction Statements。
我正在维护一个旧软件(Firebird 2.5 和 C#.net)。最近我们收到很多 "deadlock update conflicts with concurrent update" 错误。我检查了交易设置。它没有设置等待超时选项:
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 提供程序版本等),您是否进行了导致长 运行 事务执行更新?
您的应用程序代码需要更改为自动重试此错误。还要确保您的交易不要太 'long' time-wise(交易时间越长,发生此类错误的可能性就越大)。此外,您可以尝试将事务行为从 FbTransactionBehavior.RecVersion
更改为 FbTransactionBehavior.NoRecVersion
,但这会在读取当前由并发事务更新的记录时引入等待,并且实际上可能会增加更新冲突的发生如果记录已由具有较新事务 ID 的事务更新(并提交)。
另见 http://www.firebirdfaq.org/faq151/, Transactions in Firebird: ACID, Isolation levels, Deadlocks, and Resolution of update conflicts and Transaction Statements。