Sql server 如何配置MS SQL server以避免更新锁定(LCK_M_)
我有一个MS SQL server数据库,其中包含多个表。每个表都有一个字段“SN”。多个客户端可以使用此数据库,但每个客户端仅使用具有其自身SN值的记录进行操作 一种类型的客户端应用程序是使用pyodbc用python编写的遗留软件。据我所知,该软件可以创建长事务—它可以执行UPDATE或INSERT语句,并在几个小时后提交它们。我知道,这样做是错误的,但修改那个软件是不可取的 事务隔离级别设置为READ_COMMITTED,READ_COMMITTED_SNAPSHOT设置为ON 除以下情况外,一切正常:Sql server 如何配置MS SQL server以避免更新锁定(LCK_M_),sql-server,transactions,Sql Server,Transactions,我有一个MS SQL server数据库,其中包含多个表。每个表都有一个字段“SN”。多个客户端可以使用此数据库,但每个客户端仅使用具有其自身SN值的记录进行操作 一种类型的客户端应用程序是使用pyodbc用python编写的遗留软件。据我所知,该软件可以创建长事务—它可以执行UPDATE或INSERT语句,并在几个小时后提交它们。我知道,这样做是错误的,但修改那个软件是不可取的 事务隔离级别设置为READ_COMMITTED,READ_COMMITTED_SNAPSHOT设置为ON 除以下情况
是否有任何方法可以正确配置MS SQL server以解决此锁定并允许“同时”更新不同的行?在
SN
上分区可能是最好的方法。您可以使用另一种方法,但请谨慎使用。您可以通过启用跟踪标志1211来禁用锁升级。但是,此跟踪标志全局禁用SQL Server实例中的所有锁升级。锁升级在SQL Server中有一个非常有用的用途,它可以最大限度地提高查询的效率,否则查询的效率会因获取和释放数千个锁的开销而降低。锁升级还有助于最小化跟踪锁所需的内存。SQL Server可以为锁结构动态分配的内存是有限的,因此如果禁用锁升级,并且锁内存足够大,则尝试为任何查询分配额外的锁可能会失败。我找到了一个对我来说似乎可行的解决方案。如中所述。其思想是为表中的SN字段创建索引,如下所示:
CREATE INDEX IX_SN ON TABLE_NAME(SN)
您可以基于SN对表进行分区。这将删除多个客户端之间的锁定冲突。不确定这样做是否好。大多数表只包含一条具有特定SN的记录(它可以像主键一样在整个表中是唯一的),并且可以有大量不同的SN。另外,分区的数量也有限制。谢谢你的建议。关于分区-请参阅我在原始问题下面的第一条评论。禁用锁升级不是一种可行的方法,因为服务器实例还为另一个数据库提供服务,这样的更改可能是不需要的。