大家能不能帮我看看,当查询条件为非主键字段时,为什么在SQLServer的更新锁(UPDLOCK)会整表锁定?===========================================================
当我采用主键au_id列作为查询条件时,可以正常锁定查询的行:
begin tran
select * from authors with(updlock) where au_id=1
update authors set au_lname='aaa' where au_id=1
waitfor delay '00:00:30'
commit tran
上面语句中,我延时了30秒,在这30秒内:
1、另外打开第一个查询窗口,编写如下代码:(结果:正常已锁定,不能更新)
update authors set au_lname='aaa' where au_id=1
2、另外打开第二个查询窗口,编写如下代码:(结果:正常未锁定,可以更新):
update authors set au_lname='aaa' where au_id=1=============================================================
当我采用非主键au_lname列作为查询条件时,则不能正常锁定查询的行:
begin tran
select * from authors with(updlock) where au_lname='White'
update authors set au_lname='bbb' where au_lname='White'
waitfor delay '00:00:30'
commit tran
上面语句中,我一样延时了30秒,在这30秒内:
1、另外打开第一个查询窗口,编写如下代码:(结果:正常已锁定,不能更新)
update authors set au_lname='bbb' where au_lname='White'
2、另外打开第二个查询窗口,编写如下代码:(结果:不正常已锁定,不能更新):
update authors set au_lname='bbb' where au_lname='Green'
当我采用主键au_id列作为查询条件时,可以正常锁定查询的行:
begin tran
select * from authors with(updlock) where au_id=1
update authors set au_lname='aaa' where au_id=1
waitfor delay '00:00:30'
commit tran
上面语句中,我延时了30秒,在这30秒内:
1、另外打开第一个查询窗口,编写如下代码:(结果:正常已锁定,不能更新)
update authors set au_lname='aaa' where au_id=1
2、另外打开第二个查询窗口,编写如下代码:(结果:正常未锁定,可以更新):
update authors set au_lname='aaa' where au_id=1=============================================================
当我采用非主键au_lname列作为查询条件时,则不能正常锁定查询的行:
begin tran
select * from authors with(updlock) where au_lname='White'
update authors set au_lname='bbb' where au_lname='White'
waitfor delay '00:00:30'
commit tran
上面语句中,我一样延时了30秒,在这30秒内:
1、另外打开第一个查询窗口,编写如下代码:(结果:正常已锁定,不能更新)
update authors set au_lname='bbb' where au_lname='White'
2、另外打开第二个查询窗口,编写如下代码:(结果:不正常已锁定,不能更新):
update authors set au_lname='bbb' where au_lname='Green'
解决方案 »
- sql,Dateadd出错
- 文本文档导入到sql中列的问题
- 请问SQLSERVER2000中NTEXT型数据如何导出?
- 用存储过程或触发器+作业调度进行数据库同步出现问题,求助~
- sqlserver中大字段是如何存储的,比如varchar(max),text,image
- 请问各位大侠:在存储过程中如何调用其它数据库的tabel
- 我有两个数据库的备份,请问如何还原数据库
- update链接服务器数据时出错?
- 怎么对比两个表里面是否有同样的数据.并且返回结果,请大家帮忙看一下!!!
- 两个存储过程问题,帮我答了,重分酬谢
- sqlserver profiler跟踪中的列筛选器 如何设置and
- 在线几百人很卡,求解决方案。
update authors set au_lname='aaa' where au_id=1
例子应该是au_id=2之类的吧
-----------
准确的说不是主键的问题,而是聚集索引的缘故
数据的物理顺序是由聚集索引决定的,而且数据量少的话会精确锁定行
(一般数据量大的话都会引起锁升级)
而非聚集索引列应该是存储的聚集索引键值与对应列的数据,
所以非聚集索引锁定行的时候范围可能会大
我再次做了测试,就是你说的这种情况,那我要怎么样才能使用任意条件来updlock锁定表中查询行的数据呢?
一般要精确锁定的话最好还是通过聚集索引来选定行
我的最初始需求是这样的(与12306订票网站有点类似):
页面上有一个按钮,点击按钮时,会去减少数据库中剩余票的张数,当减少到0时,就会提示用户“剩余票数已经为0”,可是现在问题是,出现了多用户同时点击并发的情况,所以导致数据库中剩余票张数出现了负数,所以我想通过数据库中upblock锁定行,再事务操作的方式,来解决这个问题,不知大家有没有其他的解决办法,帮帮小弟,谢谢了!
原因嘛,我还不能准确的解释。