全面了解Mysql(八)锁

  1. 锁是数据库中很重要的存在,但是也是最不怎么需要维护的,全篇基本都是概念性的,也是我最讨厌的知识点。

  2. mysql中分为lock和latch锁,我们常说的是lock,而latch是管理mysql线程的,不怎么需要维护。
    在这里插入图片描述
    通过上图我们可以看出latch 等待次数。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述上面的图可以看出lock的一些信息

  3. innodb中的锁
    共享锁(S Lock)允许读一行数据
    排他锁(X Lock)允许事务修改一行数据
    意向共享锁(IS Lock)事务想要获取共享锁,获取共享锁时必须已有IS锁
    意向排他锁(IX Lock)事务想要获取排他锁,获取排他锁时必须已有IX锁
    在这里插入图片描述数据库在进行相关操作前必须获得相应的锁才可以操作,意向锁的目的是为了让数据库提前知道要安排的锁,除了全表扫描外,意向锁不会阻塞任何请求。
    当有事务正在执行修改操作,会进行上x锁,这个时候如果需要读该行数据,就会去undo log中读取一个快照数据,这个被称为一致性非锁定读,可以加快数据库访问速度,这个读不需要上S锁的,所以没有冲突。
    mysql对应外键,如果没有加索引,innodb会默认添加索引,避免表锁。
    mysql中行锁有3种算法,1)Record lock单个行记录上锁,2)Gap lock间隙锁,锁定一个范围,但不包含记录本身,3)Next-key lock 上两个锁的综合,锁定一个范围包括自身。innodb使用的是Next-key lock,当查询的索引含有唯一属性是会使用Record lock,这样可以解决Phantom problem(同一事务下,连续两次同样sql结果不同,就是幻读)使用范围上锁可避免不同事务处理同一记录的情况。

  4. 数据库的锁可能带来的问题
    1)脏读,如果读到了一个事务未提交的数据就叫脏读,这个违反了数据库的隔离性,READ UNCOMMITTED模式下可能会出现这个问题
    2)幻读,不可重复读,同一事务下,连续两次同样sql结果不同,和脏读区别再有事务提交了。Next-key lock 可以避免该问题出现。

  5. 引入锁后,阻塞问题
    innodb设置了参数innodb_lock_wait_timeout用来控制等待的时间,默认50s,参数innodb_rollback_on_timeout等待超时回滚操作 。

  6. 引入锁后,死锁问题
    数据库使用wait-for graph(等待图)来进行死锁检测,通过所得信息链表和事务等待链表构造出一张图,如果存在回路就会产生死锁,一般来说当检测到死锁时,innodb会选择回滚undo量最小的事务进行回滚。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章