mysql锁

文章讨论了处理读写并发的策略,如使用MVCC解决读冲突,通过读锁和写锁处理写冲突。在InnoDB存储引擎中,详细阐述了表级锁和行级锁的概念,包括间隙锁、意向锁等,以及如何防止幻读。事务的隔离级别、索引类型和执行语句都会影响加锁情况。同时,文章提到了查看和解决死锁的方法,包括通过错误日志和InnoDB状态来分析死锁,并建议让较小的事务回滚以解除死锁。
摘要由CSDN通过智能技术生成

读写并发的解决方案:

  1. 读使用MVCC, 写使用
  2. 读和写都使用锁。

读和写都使用锁进行解决

表级别的锁:

  1. 读写锁, S和X锁
  2. 间隙锁,防止幻读现象的发生
  3. 意向锁IS和IX,为了加表级锁节约时间。

行级别的锁:

  1. record-lock
  2. gap-lock
  3. next-key-lock
  4. insertAttentionLock
  5. 隐式锁:由于trx_id的存在,insert不会显式加索,如果其他事务需要加S或者X锁的时候,就会为这个事务生成一个锁,相当延迟加上一个锁

InnoDB锁的内存结构

  1. 锁所在的事务信息:指向事务的指针
  2. 索引信息:行级别的锁来说,需要记录属于哪个索引
  3. 表锁/行锁信息:
    a. 行锁:space id, page Number, n_bits
    b. 表锁:对哪个表进行加索
  4. type_mode:
    a. lock_mode
    b. lock_type: LOCK_TABLE/LOCK_REC
    c. rec_lock_type: 普通的锁,间隙锁,记录间隙锁,意向锁,其他的类型
  5. 其他信息
  6. 一堆比特位 = (1 + (n_recs + LOCK_PAGE_BITMAP_MARGIN) / 8) * 8 = (1 + (n_recs + 64) / 8) * 8
    a. heap_no
    b. infimum
    c. supremum

语句加锁分析

  1. 普通select语句
  2. 锁定读语句
  3. 半一致性读语句:如果不满足条件,就不对记录进行加锁了,直接跳过,读取下一条语句。
  4. insert 语句
    a. 遇到重复的Key
    b. 外键检查
  5. 总结:加锁情况,受到下面因素的影响
    a. 事务的隔离级别
    b. 语句执行时候的索引类型
    c. 是否精确匹配
    d. 是否是唯一性搜索
    e. 具体执行语句类型

查看事务的加锁情况:

  1. select * from information_schema.INNODB_TRX\G
  2. show engine innodb status

死锁发现与分析

  1. 求助于错误日志:使用set global innodb_print_all_deadlocks = on;
  2. 求助于show engine innodb status: 有最近的死锁情况。
  3. 死锁的解决方法是让较小的事务进行回滚
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值