如何解决sql中的lck_m_x锁

如何解决sql中的lck_m_x锁,sql,sql-server-2008,tsql,deadlock,Sql,Sql Server 2008,Tsql,Deadlock,我有一个复杂的查询(没有任何锁定提示),它从许多表中获取数据,比如表1、表2、表3 下面是检索数据的代码(没有事务) 在应用程序中,此查询每2分钟运行一次 当我启动一个简单的更新查询时 Update Table1 set Col1='abc' where ID=100 (其中ID为int,主键+聚集索引) 更新查询被延迟,并且多次超时 下面是日志 如何解决此问题。您可以在具有快照隔离级别的事务中执行查询。这样,您的查询就不会获得任何(共享)锁,您的更新也不必等待独占锁(假设表上阻止您更新

我有一个复杂的查询(没有任何锁定提示),它从许多表中获取数据,比如表1、表2、表3

下面是检索数据的代码(没有事务)

在应用程序中,此查询每2分钟运行一次

当我启动一个简单的更新查询时

Update Table1 set Col1='abc' where ID=100  
(其中ID为int,主键+聚集索引)

更新查询被延迟,并且多次超时 下面是日志


如何解决此问题。

您可以在具有快照隔离级别的事务中执行查询。这样,您的查询就不会获得任何(共享)锁,您的更新也不必等待独占锁(假设表上阻止您更新的锁的来源实际上是您的查询,应用程序每两分钟运行一次…)

作为参考,请查看和了解MSDN

因评论而编辑:

首先,为数据库启用“允许快照隔离”:

ALTER DATABASE YourDB SET ALLOW_SNAPSHOT_ISOLATION ON
然后,按如下方式编写查询:

SET TRANSACTION ISOLATION LEVEL SNAPSHOT;

SELECT      Column1, Columns2, ...
FROM        Table1
LEFT JOIN   Table2
ON          Table1.Columns45 = Table2.Column3
[... your complex query ...]

对于一个例子来说,这就足够了吗?

如果您不想在修改数据时等待读取查询,最好使用

它可以透明地打开,不会影响你的应用程序代码,也没有副作用


快照有很多副作用,例如,虽然您对数据修改没有锁定,但在提交时可能会出现冲突的数据问题,这些问题很难处理。

您能给我举个小例子吗?
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;

SELECT      Column1, Columns2, ...
FROM        Table1
LEFT JOIN   Table2
ON          Table1.Columns45 = Table2.Column3
[... your complex query ...]