9
,0); line-height:1.5!important">9
'
)
values
(-1
,0); line-height:1.5!important">'-1
无论是插入ID为-1的行还是ID为9的行都被阻塞,这是为什么?明明插入数据的ID在范围之外啊?
让我们更改数据库中的数据,再来看看两种情况就明白了
首先如果在事务中使用序列化查询后,数据库里的数据是这样:

执行insert into t_lock values(9,'9')不会阻塞
但是执行insert into t_lock values(-1,'-1')会被阻塞
如果在事务中使用序列化查询后,数据库里的数据是这样:

执行insert into t_lock values(-1,'-1')不会阻塞
但是执行insert into t_lock values(9,'9')会被阻塞

看出点眉目来了吗?
原来sqlServer在对行加范围锁的时候会先去探测数据库中加锁范围外是否还有其他数据行,如果没有,会对加锁范围外的其它行也加上范围锁,比如本文中范围锁会对ID为1~6的数据行加范围锁,它会先去查看数据库中是否存在ID小于1的数据行,如果不存在它会将ID小于1和ID为1~6的行全加上范围锁,同样它也会去看数据库中是否有ID大于6的数据行,如果没有它会将ID大于6和ID为1~6的行全加上范围锁
- 所以在最后一个图中因为sqlServer发现数据库中既有ID小于1的数据行(ID=0)也有ID大于6的数据行(ID=7),所以只在ID为1~6的范围上加范围锁,所以执行insert into t_lock values(-1,'9')都不会被阻塞
- 倒数第二个图的情况是sqlServer在数据库中只发现了有小于1的数据行(ID=0),所以将ID大于1的行都加上了范围锁,执行insert into t_lock values(9,'9')被阻塞
- 倒数第三个图的情况是sqlServer在数据库中只发现了有大于6的数据行(ID=7),所以将ID小于6的行都加上了范围锁,执行insert into t_lock values(-1,'-1')被阻塞
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。