Sql server 如何使用FireDAC和SQL Server避免不需要的事务和锁

Sql server 如何使用FireDAC和SQL Server避免不需要的事务和锁,sql-server,delphi,firedac,Sql Server,Delphi,Firedac,通过分析SQL Server中的表锁,我在RAD Studio XE7中构建的Win32应用程序在每个FDQuery处于活动状态时启动大量事务。有时,这会导致应用程序出现问题,并锁定数十个用户。特别是对于触发表 在测试中,我使用简单的FDConnection和FDQuery作为默认设置的Select*fromcustomer,并得出结论认为FDQuery1.Active:=True会导致客户表事务的启动。当FDQuery1.Active:=false时,事务消失 我想禁止在FDQuery中启动只

通过分析SQL Server中的表锁,我在RAD Studio XE7中构建的Win32应用程序在每个FDQuery处于活动状态时启动大量事务。有时,这会导致应用程序出现问题,并锁定数十个用户。特别是对于触发表

在测试中,我使用简单的FDConnection和FDQuery作为默认设置的
Select*fromcustomer
,并得出结论认为
FDQuery1.Active:=True
会导致客户表事务的启动。当
FDQuery1.Active:=false
时,事务消失

我想禁止在FDQuery中启动只读事务,如网格或报表的数据列表


但是我找不到合适的FDQuery调优方法。

查看表的NOLOCK关键字

默认情况下,SQL Server不实现数据块的版本控制。因此,为了返回一组一致的行,它保证在执行查询期间不会有其他会话使用共享锁对数据进行更改

使用“WITH(NOLOCK)”禁用共享锁,但可能会导致结果集不一致


唯一的解决方案是使用READ_Committed_SNAPSHOT隔离级别,该级别将更改的数据存储到temp,用于返回一致的结果集,而不锁定更新。

调整SQL Server的设置,以便读者不阻止写入程序是最简单的方法。它在存储上产生了更多的负载,但是使用行版本控制而不是为读卡器锁定可以消除很多死锁。读取已提交的快照。大多数其他数据库都使用这种方法。谢谢Brian。但是,由于数据库太大,许多用户同时工作,所以我不能把属性TFDCONTICANT.TXOPOX.XXIAPHOT与您提到的SQLServer设置结合起来。在这种情况下,我想建议您调整组件FDQuery的属性,以便获得不带锁的查询。不要将FireDAC与SQL server一起使用。改用“本机”ADO(dbGO)组件。我这样做。这只是一个建议。您的信息可能会有所不同。我尝试从(NOLOCK)的客户那里执行
select*。但交易还是创建了。FireDAC可能在之前启动隐式事务。