有时在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下没法产生同享锁时,可以通过上述方式,提高数据库的运行效力,终究使得系统更稳定。
本文来源:https://www.yuntue.com/post/103558.html | 云服务器网,转载请注明出处!

微信扫一扫打赏
支付宝扫一扫打赏