• 老毕
    2019-08-19
    意向锁是一种协作机制,用于表锁和行锁的共生场景。

    意向锁表达的信息很明确:某事务打算获得某种行锁,或某事务已持有某种行锁。

    这样一来,打算锁表的事务就能迅速获得足够的锁信息并决定下一步行动。

    反之,如果没有意向锁机制,打算锁表的事务就必须遍历所有行的锁信息,才能获得足够的锁信息,这样实际上就形成了行锁对表锁的严重干扰。

    如果表锁和行锁不共生,如MyISAM仅支持表锁,就不需要意向锁了。
    展开
    
     21
  • wonderq_gk
    2019-08-29
    死锁那个演示有问题啊,死锁是互相等待,而你演示的只是单方等待,很正常啊,根本就不是死锁
     2
     16
  • 小年
    2019-09-08
    啊,读锁不是不能修改吗,为啥模拟的客户端2说理论上可以修改呀?
     2
     5
  • melon
    2019-08-24
    老师 意向锁(intent lock)和间隙锁(gap lock) 还有next-key lock 能否说一下呢

    作者回复: 感谢提问,在InnoDB中有三种行锁的方式:
    1)记录锁:针对单个行记录添加锁。
    2)间隙锁(Gap Locking):可以帮我们锁住一个范围(索引之间的空隙),但不包括记录本身。采用间隙锁的方式可以防止幻读情况的产生。
    3)Next-Key锁:帮我们锁住一个范围,同时锁定记录本身,相当于间隙锁+记录锁,可以解决幻读的问题

    
     3
  • 许童童
    2019-08-19
    使用 MySQL InnoDB 存储引擎时,为什么对某行数据添加排它锁之前,会在数据表上添加意向排他锁呢?
    这样就不需要逐行扫描,看每一行上是否有排它锁了,通过大粒度,来节省资源。
    
     3
  • 峻铭
    2019-09-23
    乐观锁让我想起了java里面的cas原理

    作者回复: 对 乐观锁的一种实现

     1
     2
  • Hash
    2019-12-25
    问题——
    告诉其他人这个数据页或数据表已经有人上过排它锁了,这样当其他人想要获取数据表排它锁的时候,只需要了解是否有人已经获取了这个数据表的意向排他锁即可。而不需要进行全表的扫描,节省时间,提高效率!

    作者回复: 对的

    
     1
  • wonderq_gk
    2019-08-29
    主要是共享锁会发生死锁,排他锁应该不会
    
     1
  • yhui
    2019-08-23
    陈老师,我们同姓,麻烦帮忙看看这个问题:
    SELECT id FROM user
    WHERE 1=1 AND aid IN (1,2)
    AND bid IN (4)
    AND cid IN (-1,0,1,2,3,4,5,6,7,17,16,15,14,13,12,18,8)
    ORDER BY id DESC LIMIT 20
    我创建了(aid,bid,cid,did)的联合索引
    使用explain分析发现这条语句没用上联合索引,反而用的主键索引,然后我试着修改了下语句
    AND cid IN (-1,0,1,2,3,4,5,6,7,17,16,15,14,13,12,18,8) 把这句改成
    AND cid IN (-1,0,1,2) 改短了一些,发现索引选择对了!

    这是为什么啊,in里有个数限制多少个会触发优化器重新选择索引导致选错吗??

    展开
     2
     1
  • 小蚂蚁
    2020-01-16
    但是共享锁不是所谓的读锁吗?读锁不是不允许修改吗?读锁在行级别允许对行进行修改?
    
    
  • 小蚂蚁
    2020-01-16
    读锁是可以多个客户端同时度的,读锁之所以在事务中会死锁,本质上应该是数据库的读锁是不可重入的吧,即不能重复对一把锁加锁?
    
    
  • Hash
    2019-12-25
    悲观锁和乐观锁
    从字面上来理解,那就是一个是悲观的,一个是乐观的,至于什么意思,作为中国人,这词语的意思你不会不懂!

    悲观锁
    比如说有一个人总是小心翼翼的,吃饭喝水要验毒,家里要装摄像头,走路都要左顾右盼,生怕别人害他,在数据库中也就是生怕别人操作它的数据,干什么之前都要先检查一遍(加锁操作),等我使用完了,我在开放。(这样的人生其实太累了,容易死锁)

    乐观锁
    有个人干什么都很放心自己,也放心别人,大大咧咧,,吃饭也不管有没有毒就吃,类似于这样的操作就叫做是乐观锁,总是认为别人不会操作他的数据,就去操作数据,在提交的时候,根据固定的信息去检查一下,一般就是version.这样的话,如果发现信息不对(别人谋害他),就不更新了(去医院治愈好了)
    展开

    作者回复: 总结的不错

    
    
  • 爬行的蜗牛
    2019-12-21
    因为意向排它锁目的就是告诉其他事务,目前那些行已经有排它锁,避免其他事物对已经有排它锁的行操作, 更好的避免死锁。
    
    
  • 刘育飞
    2019-12-19
    我的mysql 用 innodb 设置自动 提交事务,我没手动开启和提交事务,我执行更新语句时,会自动加行锁吗
    
    
  • 冲
    2019-11-19
    老师还有个问题问下,表级锁在一个库中只能对一个表添加吗?
    我先对第一个表player添加了表级锁,这时使用UODATE 返回Table 'player' was locked with a READ lock and can't be updated,这时正常的
    我再对player_score添加表级锁 ,这次再对表player UPDATE返回 Table 'player' was not locked with LOCK TABLES,这时player也不能进行SELECT查询,同样返回Table 'player' was not locked with LOCK TABLES
    
    
  • 冲
    2019-11-19
    老师有个问题,这个锁是一般在我进行select等语句是或自动加锁吗?而在这里只是讲了有这几种锁的机制。还是说正常情况下数据库不会主动加锁,我需要主动去加锁。
    
    
  • ABC
    2019-11-19
    回来补课,8月学了一段时间,然后去忙其他的了,希望年内能学完这门课😀😀

    作者回复: 加油ABC同学,可以先粗略浏览一遍,然后找文章中感兴趣的内容,有代码的地方 自己复现一遍

     1
    
  • Coool
    2019-10-25
    读锁的模拟实验里,为什么可以修改上了锁的数据?
    
    
  • Beson
    2019-10-10
    老师你好,可以再详细解释一下,为什么共享锁会发生死锁吗?举的例子不太明白
    
    
  • edc
    2019-10-07
    【在进行SELECT的时候,会将对象进行共享锁锁定】这句有点模糊,如果select自动就加上了共享锁,为什么还要在SQL中加上 lock in share mode
    
    
我们在线,来聊聊吧