有关数据库加锁的问题

youxikaifa113 2011-09-26 04:41:04
请问下HOLDLOCK和UPDLOCK使用上具体有什么差别,看资料上是不是说:假如我用了HOLDLOCK锁定了一个表,则此时该select事务要是还没结束时,其它事务是不能修改该表任何行的数据?

ms-sql加锁时一定要调用select语句吗,就是说我update或insert或delete语句能不能加锁?

还有就是行锁、表锁、页锁跟HOLDLOCK或UPDLOCK一起使用的时候好像达不到效果,比如:
第一个程序执行了一下sql语句:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
begin tran
SELECT * from [table1] with (ROWLOCK,UPDLOCK) where id=1
waitfor delay '00:00:30'
commit tran

第二个程序执行了一下sql语句:
begin tran
update [table1] set A='aa' where id=2
commit tran
但是此时当第一个执行且在等待的30秒内又执行了第二个,但是第二个并不会马上执行,需要等到第一个执行完才执行,
请教下,按找到的资料来看,不是说(ROWLOCK,UPDLOCK)表示行级的更新锁吗,为啥实际上用起来还是变成了表级的更新锁了?直接(ROWLOCK)倒是可以,我就是想问下那几个锁可以搭配使用?
...全文
180 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
youxikaifa113 2011-09-26
  • 打赏
  • 举报
回复
讲了许多,有个问题还是没明白,首先假如行锁不自动锁升级的话:
1.假如我update操作,我要把它的默认排他锁修改为行锁,是不是一定要这样写:
select * from [tb1] with (rowlock) where id=1
update [tb1] set name='aa' where id=1
NBDBA 说的“需要更高锁是需要显式写明”,ms-sql是不是一定要多加上一句select,我看Oralce好像都可以直接写在update语句中

2.select如果查询的数据库记录非常多用时很长,默认的共享锁是不是在select事务未结束前不允许其它线程的事务更新插入删除该表的其它数据。
如果要让其它事务能操作其它数据,是不是还是得用行锁
youxikaifa113 2011-09-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 NBDBA 的回复:]
排它锁就会诸塞其他进程读写
你的希望其实是希望行琐,使得一次操作不影响其它行,但是这个行琐需要微软来解决,sql server虽然有行琐,但是大部分情况,sql server的内存机制使得大部分行琐都自动升级为页锁。
[/Quote]
如果这样的话是不是就说即使是并发的,如果数据库存储记录非常多的时候效率同样是非常低的
NBDBA 2011-09-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 youxikaifa113 的回复:]
引用 3 楼 orchidcat 的回复:
这显然误解了select默认只加共享锁,所以需要更高锁是需要显式写明,而update或insert或delete会默认加排它锁,一般不需要指定锁。

请教下,update或insert或delete时如果我只想对操作的那行加排它锁,不阻塞其它行的操作,该怎么写?
排它锁能只影响一行吗?
[/Quote]
排它锁就会诸塞其他进程读写
你的希望其实是希望行琐,使得一次操作不影响其它行,但是这个行琐需要微软来解决,sql server虽然有行琐,但是大部分情况,sql server的内存机制使得大部分行琐都自动升级为页锁。
youxikaifa113 2011-09-26
  • 打赏
  • 举报
回复
假设我的数据库中存储了n条记录,我调用select * from [tb1] where id=999901,此时由于查询操作用时比较长,select默认采用共享锁,是不是说我在select的事务还没返回时,无法修改表内其它行的数据了,只能读数据?
此时如果我只希望id=999901这条数据不被修改,不阻塞其它事务的操作,我是不是应该采用rowlock锁?
youxikaifa113 2011-09-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 orchidcat 的回复:]
这显然误解了select默认只加共享锁,所以需要更高锁是需要显式写明,而update或insert或delete会默认加排它锁,一般不需要指定锁。
[/Quote]
请教下,update或insert或delete时如果我只想对操作的那行加排它锁,不阻塞其它行的操作,该怎么写?
排它锁能只影响一行吗?
youxikaifa113 2011-09-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fredrickhu 的回复:]
http://blog.csdn.net/arrow_gx/archive/2009/03/19/4004938.aspx
[/Quote]

请教下,单独使用UPDLOCK不也是也是保存该锁,直到事务结束吗?这样HOLDLOCK和UPDLOCK这这两个需要组合吗?
NBDBA 2011-09-26
  • 打赏
  • 举报
回复
还有就是行锁、表锁、页锁跟HOLDLOCK或UPDLOCK一起使用的时候好像达不到效果

行锁、表锁、页锁是一个分类的,但是实际应用中,行锁往往自动升级为页锁,你的测试是这个原因。
关于锁升级,太长说不清
NBDBA 2011-09-26
  • 打赏
  • 举报
回复
ms-sql加锁时一定要调用select语句吗,就是说我update或insert或delete语句能不能加锁?

这显然误解了select默认只加共享锁,所以需要更高锁是需要显式写明,而update或insert或delete会默认加排它锁,一般不需要指定锁。
Mr_Nice 2011-09-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 youxikaifa113 的回复:]
请问下HOLDLOCK和UPDLOCK使用上具体有什么差别,看资料上是不是说:假如我用了HOLDLOCK锁定了一个表,则此时该select事务要是还没结束时,其它事务是不能修改该表任何行的数据?

ms-sql加锁时一定要调用select语句吗,就是说我update或insert或delete语句能不能加锁?

还有就是行锁、表锁、页锁跟HOLDLOCK或UPDLOCK一起使用的时候好像达……
[/Quote]

主要是因为锁升级了。
NBDBA 2011-09-26
  • 打赏
  • 举报
回复
个人通俗的理解:
HOLDLOCK和UPDLOCK这是不同分类的锁

HOLDLOCK是保持锁的概念,就是加的锁保持到事务结束,而不是语句结束
UPDLOCK是数据更新需要加的锁,更新锁表示自己需要更新数据,不允许别人来读写这个数据。

这两个是可以组合的,表示更新锁保持到事务结束。

34,873

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧