database如何实现锁不住的查询


这篇文章主要介绍了如何实现锁不住的查询,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。然后,建立一个连接,执行下面的脚本来实现加锁。通过执行结果,可以看到对象被加锁的情况:表级和页级上是IX锁,记录上是X锁。spidtran_countdatabase_nameobject_id511db_xlock_test21575115spiddbidObjIdIndIdTypeResourceModeStatus51700DBSGRANT517215751151PAG0.095138889IXGRANT517215751150TABIXGRANT51111311510750TABISGRANT517215751151KEY(020068e8b274)XGRANT517215751151KEY-10086470766XGRANT然后新建一个连接,执行下面的T-SQL查询,看看会否被连接1锁住上述查询会很快返回结果,并不会被查询1阻塞住。按照我们的了解(联机帮助上也有说明),在READ COMMITTED事务隔离级别下,查询使用共享锁(S),而根据锁的兼容级别,S锁是与X锁冲突的,所以正常情况下,连接2的查询需要等待连接1执行完成。可是测试的结果去违反了这一原则。为了了解为什么连接2不会被阻塞,对连接2做了一个Trace,发现一个更郁闷的问题,Trace的结果如下:EventClassTextDataObjectIDTypeModeLock:Acquired215751155 – OBJECT6 – ISLock:Acquired1:7706 – PAGE6 – ISLock:Acquired[PLANGUIDE]02 – DATABASE3 – SLock:Acquired215751155 – OBJECT6 – ISLock:Acquired1:7706 – PAGE6 – ISLock:Acquired1:8006 – PAGE6 – ISLock:Acquired1:8906 – PAGE6 – ISTrace的前面两行是连接2Trace结果,从结果看,连接2仅使用了意向共享锁(IS),而且只是表级和页级,按照锁的兼容性原则,ISIX(连接1在表级和页级仅使用了IX锁)是不冲突的,所以连接2的查询不会被阻塞。在增加了查询的数据量后,Trace结果表明查还是只在表级和页级使用了IS锁(Trace结果的最后4行)。对于这个问题,解决的办法当然就是提升连接1锁的粒度,使用PAGLOCK表提示将锁的粒度提升到页级,这样ISX是冲突的,就可以成功阻塞连接2但疑问就是,为什么查询只在表级和页级下意向共享锁(IS),而不在行级下共享锁(X),这个似乎与联机帮助上的说明不一样(还是一直以来理解上的偏差呢)。附:联机帮助上关于锁模式的说明共享锁共享锁(S 锁)允许并发事务在封闭式并发控制下读取 (SELECT) 资源更新锁更新锁(U 锁)可以防止常见的死锁。在可重复读或可序列化事务中,此事务读取数据 [获取资源(页或行)的共享锁(S 锁)],然后修改数据 [此操作要求锁转换为排他锁(X 锁)]如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排他锁(X 锁)。共享模式到排他锁的转换必须等待一段时间,因为一个事务的排他锁与其他事务的共享模式锁不兼容;发生锁等待。第二个事务试图获取排他锁(X 锁)以进行更新。由于两个事务都要转换为排他锁(X 锁),并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。若要避免这种潜在的死锁问题,请使用更新锁(U 锁)。一次只有一个事务可以获得资源的更新锁(U 锁)。如果事务修改资源,则更新锁(U 锁)转换为排他锁(X 锁)。排他锁排他锁(X 锁)可以防止并发事务对资源进行访问。使用排他锁(X 锁)时,任何其他事务都无法修改数据;仅在使用 NOLOCK 提示或未提交读隔离级别时才会进行读取操作。数据修改语句(如 INSERTUPDATE DELETE)合并了修改和读取操作。语句在执行所需的修改操作之前首先执行读取操作以获取数据。因此,数据修改语句通常请求共享锁和排他锁。例如,UPDATE 语句可能根据与一个表的联接修改另一个表中的行。在此情况下,除了请求更新行上的排他锁之外,UPDATE 语句还将请求在联接表中读取的行上的共享锁。意向锁数据库引擎使用意向锁来保护共享锁(S 锁)或排他锁(X 锁)放置在锁层次结构的底层资源上。意向锁之所以命名为意向锁,是因为在较低级别锁前可获取它们,因此会通知意向将锁放置在较低级别上。感谢你能够认真阅读完这篇文章,希望小编分享如何实现锁不住的查询内容对大家有帮助,同时也希望大家多多支持开发云,关注开开发云主机域名发云行业资讯频道,遇到问题就找开发云,详细的解决方法等着你来学习!

相关推荐: 查看mysql当前连接数的方法详解

1、查看当前所有连接的详细资料:  ./mysqladmin -uadmin -p -h20.140.1.1 processlist2、只查看当前连接数(Threads就是连接数.):  ./mysqladmin -uadmin -p -h20.140.1.1…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 06/11 17:03
下一篇 06/11 17:03

相关推荐