MSSQL下无法产生共享锁(mssql不产生共享锁)

有时在MSSQL下,由于某些原因,产生的锁会变成独占锁而无法产生共享锁,造成什么后果呢?

首先,什么是共享锁?当数据库资源被某个事务持有,其他的事务可以访问被持有的资源,但不能更改它时,就会产生共享锁。共享锁把锁定的资源与其他事务共享,并能够针对同一资源进行并发读取操作。

MSSQL在运行过程中,如果某个事务持有了一个资源,其他事务需要访问同一资源时,无法产生共享锁,而是被迫产生独占锁,这样的后果就是其他事务就不能进行读取操作,只能排队等候前面的事务释放资源才能进行操作,从而将系统效率急剧下降。

解决这一问题,可以使用以下代码:

BEGIN TRANSACTION

SELECT * FROM 表名

按需要添加 WITH (ROWLOCK, READPAST)

COMMIT TRANSACTION

此代码可以确保获取共享锁,而不是独占锁。上述代码后面多加一句 WITH (ROWLOCK, READPAST),表示使用共享锁以及跳过当前正在使用共享锁的行,这样可以有效把行锁变成页锁,避免锁定多行,简化事务的处理,提升了系统的性能。

另外,也可以使用索引,比如 CREATE nonclustered INDEX index_test ON 表名(列名1,列名2),这样SQL Server会隐式提供读取数据的共享锁,这样可以替换上面的代码,可以极大减少 SELECT语句的并发问题。

总之,在MSSQL下无法产生共享锁时,可以通过上述方式,提高数据库的运行效率,最终使得系统更稳定。


数据运维技术 » MSSQL下无法产生共享锁(mssql不产生共享锁)