加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 如何使Firebird客户端应用程序等待行解锁

发布时间:2020-12-15 06:10:47 所属栏目:大数据 来源:网络整理
导读:我熟悉的是使用ADO(dbGo)的Microsoft SQL Server世界,我已经为该环境编写了许多应用程序.现在我有一个传统的Delphi 7应用程序与一个Firebird 2.5数据库,我必须维护. 但是我发现如果2个客户端应用程序执行这个: SQLQuery.SQL.Text := 'Update mytable set fi
我熟悉的是使用ADO(dbGo)的Microsoft SQL Server世界,我已经为该环境编写了许多应用程序.现在我有一个传统的Delphi 7应用程序与一个Firebird 2.5数据库,我必须维护.

但是我发现如果2个客户端应用程序执行这个:

SQLQuery.SQL.Text := 'Update mytable set field1 = 11 where keyfield = 99'
SQLQuery.Execute;

在几乎完全相同的时间,第二个应用程序立即获得“死锁”错误.在SQL Server中,会有一个等待期

ADOConnection.Isolationlevel = ilCursorstability;
ADOConnection.CommandTimeout := 5;

在第二个客户端应用程序中引发任何异常之前.异常处理可能涉及在批处理过程中被视为非常不寻常的情况的回滚.这是合理的. 5秒是计算机处理时间非常长的时间.

现在我在Firebird客户端使用相同方法的尝试是无效的,因为“死锁”(实际上是一个使用中的记录)立即发生.

如果数据库引擎不能配置等待一些条件来改善(记录要释放的锁),那么责任现在必须由客户端应用程序开发人员负责,他们必须编写疯狂的缓慢代码来克服我认为是主要的Firebird失败.

一旦检测到“死锁”,除了断开连接组件之外,条件不清楚

while rowsupdated = 0 and counter < 5 do
begin
  try
    rowsupdated := SQLQuery.Execute;
  except
    SQLConnection.Connected := False;
    SQLConnection.Connected := True;
  end;
  Inc(Counter)
end;

当您在Firebird中没有任何实质的锁容忍时,如何在Delphi中使用DBX,如何使强大的多用户表更新客户端?

解决方法

客户端可以指定事务是否应该等待死锁解决.如果在这种情况下,死锁立即发生,可能是因为您的配置(在客户端使用nowait事务参数).不使用nowait将导致服务器端检测到死锁,并且(在可配置的超时后)会在客户端引发异常.

自Firebird 2.0以来,您还可以从客户端指定事务的锁定超时,覆盖服务器配置的超时值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读