专业制作假行驶证,泉州seo按天扣费,wordpress覆盖升级,创建全国文明城市标语口号曾今有件事情让我记忆犹新#xff0c;那年刚来携程不久#xff0c;马上就被安排写一个接口#xff0c;供企鹅公司调用他们员工的差旅信息#xff0c;然后我就三下五除二的给写好了#xff0c;上线之后#xff0c;大概过了一个月。。。DBA那边报告数据库出现大量锁超时那年刚来携程不久马上就被安排写一个接口供企鹅公司调用他们员工的差旅信息然后我就三下五除二的给写好了上线之后大概过了一个月。。。DBA那边报告数据库出现大量锁超时并且及时根据sql的来源将email发到了我们部门指出sql读取时间过长并且缺少nolock影响了大量机票订单入库然后我就拿着sql去生产环境跑了下22s。。。花擦。。。项目上线时间太久版本已经不存在了无法回滚。。。原本准备撤下接口。。。看了下撤下接口跟加上nolock时间相差不多最后决定先加上nolock发布紧急单。。。然后再优化DBA那边暂时做手工解锁发上去后最后就是损失XXXX订单。。。定级为三级事件。然后就是追责当然这个责任只能有老大们去承担了出了这次由我引发的事件我得思考了出了事情对我不见得全是坏事起码这次会让我铭记如心想想也搓来携程之前根本就不会关注要不要给select指定nolock这其中也包括自己没遇到过大数据吧也包括自己的能力有限只知道有锁这个玩意细说的话就啥也不知道了后来才知道携程有个规则就是很多业务产线所写的select都必须指定nolock懂一点的人可能会说nolock可以提升性能如果你这样说确实是这样因为数据库的锁是有96字节开销的没了锁也就没有你在profile中看到accquired和released痉挛了当你看完我的事件之后你可能会意识到性能提升不是最关心的最关心的就是不要出现死锁锁等待。。。好了言归正传下面我们看看到底在数据库中可以指定多少个锁一到底可以指定多少个锁这个问题有意思我们不需要记只要你装一个SQL Prompt有了这个神器你就知道到底有多少个如下图
DROP TABLE dbo.Person
CREATE TABLE Person(ID INT IDENTITY,NAME CHAR(4000) DEFAULT xxxxx)
INSERT INTO dbo.Person DEFAULT VALUES
go 6
一眼扫下去还是蛮多的不过你要注意了那些所谓的XXXLock才是我们需要关注的根据上面的图我们大概把锁分个类。。。粒度锁PAGLOCK, TABLOCK, TABLOCKX, ROWLOCK, NOLOCK模式锁HOLDLOCK, UPDLOCK, XLOCK接下来我从粒度锁说起1. NOLOCK都说nolock是无锁模式的那到底是怎样的无锁呢到这篇为止你应该知道如果不加nolock我们的表数据页是附加IS锁的那接下来我用profile看下两者有什么区别。从上图中你会看到加上nolock之后object上面附加了Sch-S锁这个锁叫做“架构稳定锁”很简单就是sql编译时附加的一把锁目的就是防止在编译时有其他连接修改表结构而这个锁只与Sch-M锁冲突与其他锁都兼容这说明什么说明其他连接锁住了记录也没关系我的nolock不跟他们打交道这样的话就可能会读到脏数据不过没关系携程的很多业务是容许脏数据的毕竟比锁等待死锁要强得多再说nolock读到了其他连接未修改或者未提交的数据这个概率也比较低就算遇到了也没关系一般不会招来客诉的客人或许再刷下页面数据或许就正确了对不对。。。2.TABLOCK这个还是比较见名识义的就是附加在table上的锁也就是表锁了很恐怖的。。。下面我举个Update的例子看看前后对比。在上面你有没有看到X锁已经附加到OBJECT上面去了。。。这样的话其他连接就动不了这个Object了只能等待。。。3. PAGLOCK看了名字你应该也知道就是附加到页面这个级别的锁我也举一个Update的例子。
BEGIN TRAN
UPDATE dbo.Person SET NAMEaaaaa WHERE ID6
BEGIN TRAN
UPDATE dbo.Person WITH(PAGLOCK) SET NAMEbbbbb WHERE ID4
从上面两个图中你应该可以看到原来附加到RID上面的U锁由于PagLock的提升现在要附加到Page上面了这个就是所谓的数据页锁。4.TABLOCKX, ROWLOCK这两个我就不细说了TABLOCKX就是直接附加在table上的X锁你可以通过select看一下。ROWLOCK的话默认情况下就是ROWLOCK比如默认的Update你会发现RID上被附加的U锁这个就是行锁。5.UPDLOCK这个锁还是蛮有意思的它就是update锁如果你select下它会呈现update的锁痉挛效果。6. XLOCK知道了UPDLOCK锁我想XLOCK你也应该明白了。。。它就是delete锁即排他锁我可以让select带上排他锁。7.HOLDLOCK最后一个我也没闹明白据说是让语句在整个事务中持有锁然后我就用select和update调试一下。
SELECT * FROM dbo.Person(HOLDLOCK)
UPDATE dbo.Person WITH(HOLDLOCK) SET NAMEbbbbb WHERE ID4
从图中可以看到HOLDLOCK不管是在select还是Update中都是对表持有锁这个就留给大家观察哈~~~好了本系列就到此为止希望您学的愉快吃的开心