为什么要有U锁

如一宝宝 2013-03-28 11:00:49
最近在解决一些死锁的问题,有一个疑问,更新锁和排他锁都是在数据更新时产生的,并且都与与S锁不兼容,既然有了排他锁,为何还需要更新锁,msdn上面讲的太笼统了,谁能帮忙解释下,谢谢!
...全文
871 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
JeanGe88 2013-11-14
  • 打赏
  • 举报
回复
查了下MSDN 更新锁 更新锁(U 锁)可以防止常见的死锁。 在可重复读或可序列化事务中,此事务读取数据 [获取资源(页或行)的共享锁(S 锁)],然后修改数据 [此操作要求锁转换为排他锁(X 锁)]。 如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排他锁(X 锁)。 共享模式到排他锁的转换必须等待一段时间,因为一个事务的排他锁与其他事务的共享模式锁不兼容;发生锁等待。 第二个事务试图获取排他锁(X 锁)以进行更新。 由于两个事务都要转换为排他锁(X 锁),并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。 若要避免这种潜在的死锁问题,请使用更新锁(U 锁)。 一次只有一个事务可以获得资源的更新锁(U 锁)。 如果事务修改资源,则更新锁(U 锁)转换为排他锁(X 锁)。 排他锁 排他锁(X 锁)可以防止并发事务对资源进行访问。 使用排他锁(X 锁)时,任何其他事务都无法修改数据;仅在使用 NOLOCK 提示或未提交读隔离级别时才会进行读取操作。 数据修改语句(如 INSERT、UPDATE 和 DELETE)合并了修改和读取操作。 语句在执行所需的修改操作之前首先执行读取操作以获取数据。 因此,数据修改语句通常请求共享锁和排他锁。 例如,UPDATE 语句可能根据与一个表的联接修改另一个表中的行。 在此情况下,除了请求更新行上的排他锁之外,UPDATE 语句还将请求在联接表中读取的行上的共享锁。 个人理解为,更新锁应该应用在多表查询的情况下。
JeanGe88 2013-11-14
  • 打赏
  • 举报
回复
引用 14 楼 seusoftware 的回复:
U锁就是用来排队的, 比方说,有很多人都在查询数据select(S锁), 这时,好几个用户要update数据,也不能大家都一起改啊,得有个先后,而且大家都发起了update申请,也不能还是S锁,这时就先给大家一个U锁,等第一个提交的人update完了(X锁释放),然后再来一个,跟银行的叫号一样。
有一个疑问,为什么不直接拿X锁等叫号?
心态要好 2013-03-31
  • 打赏
  • 举报
回复
引用 27 楼 TravyLee 的回复:
认真读MSDN上的解释 了解每个锁的定义
请求版主兄弟看看我19L和22L的问题,谢谢 我搞了好久没搞定 DBA也没回答。。
如一宝宝 2013-03-30
  • 打赏
  • 举报
回复
引用 3 楼 DBA_Huangzj 的回复:
直接更新锁,其实更新锁就如上面说的,是共享和排他的混合,而且你可以自己测一下update/delete的操作时,sys.dm_tran_locks这个表的情况
大神,你的说法与msdn上面有冲突哦 http://msdn.microsoft.com/zh-cn/library/ms175519(v=sql.105).aspx 数据修改语句(如 INSERT、UPDATE 和 DELETE)合并了修改和读取操作。 语句在执行所需的修改操作之前首先执行读取操作以获取数据。 因此,数据修改语句通常请求共享锁和排他锁。 例如,UPDATE 语句可能根据与一个表的联接修改另一个表中的行。 在此情况下,除了请求更新行上的排他锁之外,UPDATE 语句还将请求在联接表中读取的行上的共享锁。
极品老土豆 2013-03-30
  • 打赏
  • 举报
回复
SQL SERVER 的锁类型有 共享锁,排他锁,意向锁,更新锁。 共享锁意味着,事务准备执行排他锁,当前正在扫描数据,以确定它希望锁的行。 可以把更新锁看做打算转变为排他锁的共享锁。 为了避免死锁,在任意时刻,都只有一个事务可以拥有共享锁。
  • 打赏
  • 举报
回复
认真读MSDN上的解释 了解每个锁的定义
發糞塗牆 2013-03-29
  • 打赏
  • 举报
回复
引用 11 楼 SQL_Beginner 的回复:
引用 10 楼 DBA_Huangzj 的回复:引用 9 楼 SQL_Beginner 的回复: 引用 8 楼 DBA_Huangzj 的回复:引用 6 楼 SQL_Beginner 的回复: 引用 1 楼 DBA_Huangzj 的回复:引用 楼主 lowson0 的回复: 最近在解决一些死锁的问题,有一个疑问,更新锁和排他锁都是在数据更新时产生的,并且都与与S锁……
我看来找茬就是找错误,找不同,游戏不是都那样?因为我看你不是每次都发表自己意见,如果我错了,没问题,以后就不会错了,但是你不说明你的看法,不是每个人都会清楚你想表达什么
發糞塗牆 2013-03-29
  • 打赏
  • 举报
回复
引用 4 楼 lowson0 的回复:
引用 3 楼 DBA_Huangzj 的回复:直接更新锁,其实更新锁就如上面说的,是共享和排他的混合,而且你可以自己测一下update/delete的操作时,sys.dm_tran_locks这个表的情况 那为啥不直接用排他锁啊!
这个貌似没在哪里看到有说明,我个人觉得,更新锁主要在“查找”需要操作的数据时加的,如果直接加排他,那阻塞面很广。但是加共享,独占性又不够。
  • 打赏
  • 举报
回复
引用 10 楼 DBA_Huangzj 的回复:
引用 9 楼 SQL_Beginner 的回复: 引用 8 楼 DBA_Huangzj 的回复:引用 6 楼 SQL_Beginner 的回复: 引用 1 楼 DBA_Huangzj 的回复:引用 楼主 lowson0 的回复: 最近在解决一些死锁的问题,有一个疑问,更新锁和排他锁都是在数据更新时产生的,并且都与与S锁不兼容,既然有了排他锁,为何还需要更新锁,msdn上面讲的太笼统了,谁能帮……
你发表了错误的观点,我就要指出来,不然会误导更多的人,难道这样做叫找茬???????
發糞塗牆 2013-03-29
  • 打赏
  • 举报
回复
引用 9 楼 SQL_Beginner 的回复:
引用 8 楼 DBA_Huangzj 的回复:引用 6 楼 SQL_Beginner 的回复: 引用 1 楼 DBA_Huangzj 的回复:引用 楼主 lowson0 的回复: 最近在解决一些死锁的问题,有一个疑问,更新锁和排他锁都是在数据更新时产生的,并且都与与S锁不兼容,既然有了排他锁,为何还需要更新锁,msdn上面讲的太笼统了,谁能帮忙解释下,谢谢! 排……
谢谢,也希望你对楼主的问题提出答复,而不是只找别人的茬
  • 打赏
  • 举报
回复
引用 8 楼 DBA_Huangzj 的回复:
引用 6 楼 SQL_Beginner 的回复: 引用 1 楼 DBA_Huangzj 的回复:引用 楼主 lowson0 的回复: 最近在解决一些死锁的问题,有一个疑问,更新锁和排他锁都是在数据更新时产生的,并且都与与S锁不兼容,既然有了排他锁,为何还需要更新锁,msdn上面讲的太笼统了,谁能帮忙解释下,谢谢! 排它锁: 当数据发生增删改操作并修改数据时,会自动在这些数据上加上排它锁……
1"So long as a process holds an update lock on a resource, no other process can acquire an update lock or an exclusive lock for that resource;" 注意是获得,还不是申请,其他进程无法获得,但绝对可以申请,只是需要锁排队而已,这是两个完全不同的概念。 2,“ The process holding the update lock can convert it into an exclusive lock on that resource because the update lock prevents lock incompatibility with any other processes.” 不是与其他进程的任何锁都不兼容(比如说S锁还是可以获得的),而是防止其他进程获得跟其不兼容的锁而已,这又是两个完全不同的概念。
發糞塗牆 2013-03-29
  • 打赏
  • 举报
回复
引用 6 楼 SQL_Beginner 的回复:
引用 1 楼 DBA_Huangzj 的回复:引用 楼主 lowson0 的回复: 最近在解决一些死锁的问题,有一个疑问,更新锁和排他锁都是在数据更新时产生的,并且都与与S锁不兼容,既然有了排他锁,为何还需要更新锁,msdn上面讲的太笼统了,谁能帮忙解释下,谢谢! 排它锁: 当数据发生增删改操作并修改数据时,会自动在这些数据上加上排它锁。一个特定资源上只能有一个……
英语水平有限,不知道有没有译错
發糞塗牆 2013-03-29
  • 打赏
  • 举报
回复
Update Locks Update locks are really not a separate kind of lock; they are a hybrid of shared and exclusive locks. They are acquired when SQL Server executes a data modifi cation operation but fi rst, SQL Server needs to search the table to fi nd the resource that needs to be modifi ed. Using query hints, a process can specifi cally request update locks, and in that case, the update locks prevent the conversion deadlock situation presented in Figure 10-6 later in this chapter. Update locks provide compatibility with other current readers of data, allowing the process to later modify data with the assurance that the data hasn’t been changed since it was last read. An update lock is not suffi cient to allow you to change the data—all modifi cations require that the data resource being modifi ed have an exclusive lock. An update lock acts as a serialization gate to queue future requests for the exclusive lock. (Many processes can hold shared locks for a resource, but only one process can hold an update lock.) So long as a process holds an update lock on a resource, no other process can acquire an update lock or an exclusive lock for that resource; instead, another process requesting an update or exclusive lock for the same resource must wait. The process holding the update lock can convert it into an exclusive lock on that resource because the update lock prevents lock incompatibility with any other processes. You can think of update locks as “intent-to-update” locks, which is essentially the role they perform. Used alone, update locks are insuffi cient for updating data—an exclusive lock is still required for actual data modifi cation. Serializing access for the exclusive lock lets you avoid conversion deadlocks. Update locks are held until the end of the transaction or until they are converted to an exclusive lock. Don’t let the name fool you: update locks are not just for UPDATE operations. SQL Server uses update locks for any data modifi cation operation that requires a search for the data prior to the actual modifi cation. Such operations include qualifi ed updates and deletes, as well as inserts into a table with a clustered index. In the latter case, SQL Server must fi rst search the data ( using the clustered index) to fi nd the correct position at which to insert the new row. While SQL Server is only searching, it uses update locks to protect the data; only after it has found the correct location and begins inserting does it convert the update lock to an exclusive lock.
引用 6 楼 SQL_Beginner 的回复:
引用 1 楼 DBA_Huangzj 的回复:引用 楼主 lowson0 的回复: 最近在解决一些死锁的问题,有一个疑问,更新锁和排他锁都是在数据更新时产生的,并且都与与S锁不兼容,既然有了排他锁,为何还需要更新锁,msdn上面讲的太笼统了,谁能帮忙解释下,谢谢! 排它锁: 当数据发生增删改操作并修改数据时,会自动在这些数据上加上排它锁。一个特定资源上只能有一个……
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
引用 楼主 lowson0 的回复: 最近在解决一些死锁的问题,有一个疑问,更新锁和排他锁都是在数据更新时产生的,并且都与与S锁不兼容,既然有了排他锁,为何还需要更新锁,msdn上面讲的太笼统了,谁能帮忙解释下,谢谢! 排它锁: 当数据发生增删改操作并修改数据时,会自动在这些数据上加上排它锁。一个特定资源上只能有一个排它锁。当资源上加上排它锁,其他任何锁都不能加在相同的资源上,因为和其他……
"当一个进程对一个资源加上更新锁之后,其他经常无法对这个资源申请更新锁或者排它锁。持有更新锁的进程可以把更新锁转换成排它锁,因为更新锁与其他进程的任何锁都不兼容。" 1,当一个进程对一个资源加上更新锁之后,其他经常无法对这个资源申请更新锁或者排它锁? 2,更新锁与其他进程的任何锁都不兼容??
如一宝宝 2013-03-29
  • 打赏
  • 举报
回复
引用 23 楼 kalagooooo 的回复:
引用 20 楼 DBA_Huangzj 的回复:引用 19 楼 kalagooooo 的回复:引用 12 楼 DBA_Huangzj 的回复: 引用 11 楼 SQL_Beginner 的回复:引用 10 楼 DBA_Huangzj 的回复:引用 9 楼 SQL_Beginner 的回复: 引用 8 楼 DBA_Huangzj 的回复:引用 6 楼 SQL_Begin……
兄弟,你不厚道啊。
如一宝宝 2013-03-29
  • 打赏
  • 举报
回复
引用 8 楼 DBA_Huangzj 的回复:
引用 6 楼 SQL_Beginner 的回复:引用 1 楼 DBA_Huangzj 的回复:引用 楼主 lowson0 的回复: 最近在解决一些死锁的问题,有一个疑问,更新锁和排他锁都是在数据更新时产生的,并且都与与S锁不兼容,既然有了排他锁,为何还需要更新锁,msdn上面讲的太笼统了,谁能帮忙解释下,谢谢! 排它锁: 当数据发生增删改操作并修改数据时,会自动……
更新锁可以与共享锁兼容,那如何保证数据的一致性呢?a用户拿到了更新锁,b可以拿共享锁,那a改了数据,b拿到的数据不就不准确了?
心态要好 2013-03-29
  • 打赏
  • 举报
回复
引用 20 楼 DBA_Huangzj 的回复:
引用 19 楼 kalagooooo 的回复:引用 12 楼 DBA_Huangzj 的回复: 引用 11 楼 SQL_Beginner 的回复:引用 10 楼 DBA_Huangzj 的回复:引用 9 楼 SQL_Beginner 的回复: 引用 8 楼 DBA_Huangzj 的回复:引用 6 楼 SQL_Beginner 的回复: 引用 1 楼 DBA_Hua……
万恶的改版 现在只有相互关注才能发私信,微博上跟蒋涛反应也不行,在楼主的帖子里歪楼不好意思了啊, dba能互粉下么,以前给你发过私信的
心态要好 2013-03-29
  • 打赏
  • 举报
回复
引用 20 楼 DBA_Huangzj 的回复:
引用 19 楼 kalagooooo 的回复:引用 12 楼 DBA_Huangzj 的回复: 引用 11 楼 SQL_Beginner 的回复:引用 10 楼 DBA_Huangzj 的回复:引用 9 楼 SQL_Beginner 的回复: 引用 8 楼 DBA_Huangzj 的回复:引用 6 楼 SQL_Beginner 的回复: 引用 1 楼 DBA_Hua……
就是匹配多个数字 比如:item-38256.html、item-111156.html、item-44456.html productUrl like 'item-这里怎么匹配.html'
發糞塗牆 2013-03-29
  • 打赏
  • 举报
回复
引用 19 楼 kalagooooo 的回复:
引用 12 楼 DBA_Huangzj 的回复: 引用 11 楼 SQL_Beginner 的回复:引用 10 楼 DBA_Huangzj 的回复:引用 9 楼 SQL_Beginner 的回复: 引用 8 楼 DBA_Huangzj 的回复:引用 6 楼 SQL_Beginner 的回复: 引用 1 楼 DBA_Huangzj 的回复:引用 楼主 lowson0 的回复: 最近在解决一些……
(ProductHost like 'book.360buy.com') 你这部分直接=不就可以了? 另外ProductUrl 你的规则是啥?
心态要好 2013-03-29
  • 打赏
  • 举报
回复
引用 12 楼 DBA_Huangzj 的回复:
引用 11 楼 SQL_Beginner 的回复:引用 10 楼 DBA_Huangzj 的回复:引用 9 楼 SQL_Beginner 的回复: 引用 8 楼 DBA_Huangzj 的回复:引用 6 楼 SQL_Beginner 的回复: 引用 1 楼 DBA_Huangzj 的回复:引用 楼主 lowson0 的回复: 最近在解决一些死锁的问题,有一个疑问,更……
请教dba一个模糊查询的问题: select * from Product WHERE (ProductHost like 'book.360buy.com') and (ProductUrl like '/[0-9]%[0-9].html%') [0-9]只能匹配一个数字 其实这里的数字位数是不确定的,求教如何写这个模糊查询?
加载更多回复(10)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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