liaowenxiong 2021-10-14 22:48 采纳率: 44.4%
浏览 17
已结题

百度百科对共享锁的的理解不对吧?

共享锁(S锁)又称为读锁,若事务T对数据对象A加上S锁,则事务T只能读A;其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

上述是百度百科对共享锁的理解。我认为是错误的。
1.所谓锁,肯定是一个线程或者一个事务先对某种资源上锁了,那么其它线程或者事务访问相同资源时就需要等待或者某些方面被限制了。所以事务T对数据对象A加上了S锁,其它事务就不能重复再加S锁了,重复加意义何在呢?

2.共享锁,就是事务T先访问数据对象A,它先上锁了,这个锁在数据读取方面是共享的,所以其它事务可以读取但是不能修改,但是事务T自己是可以修改数据的

3.事务T释放锁了,其它事务才能在数据对象A上锁,而不是说事务T上锁了,其它事务访问的时候也来上锁,根本就没有这个必要,而且毫无意义,其它事务正常读取数据,他们上什么锁呢?只能说事务T先锁上了,其它事务后来者,只好等事务T 是否锁才能再上自己需要的锁才对嘛!

  • 写回答

2条回答 默认 最新

  • 唯一的小彬哥 2021-10-15 11:35
    关注

    你的理解并不全面。加锁当然是有必要的
    我给你举个例子吧 A会话和B会话C都要访问表1
    下面的流程是按你的思路来理解的
    A访问表1 加锁查表1
    B访问表1 发现锁住了,不加锁因为没必要,直接查
    C删除表1 这时A查询已经结束释放了锁但B还没查询结束。C发现锁没了于是删除表1。这时请问B怎么办?
    如果这时候B也有共享锁这个问题就能避免了, C会被阻塞直到B完成。所以任何事务开始时必然要加共享锁。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月24日
  • 已采纳回答 10月16日
  • 创建了问题 10月14日