MySQL高级性能优化9---锁

本文探讨了锁在现实生活和计算机中的概念,区分了读写锁和不同粒度的表锁。深入解析了InnoDB和MYISAM的行锁特性,以及事务的ACID属性和隔离级别。同时揭示了并发操作可能导致的脏读、不可重复读和幻读问题,以及设置和调整隔离级别的方法。

概念
  • 锁,在现实生活中就是隐藏于外界的一种工具
  • 在计算机中就是协调多个进程或线程并发访问某一个资源的一种机制
分类
  • 按操作分

    • 读锁(共享锁)
    • 写锁(排他锁)
  • 按粒度分

    • 表锁

      • 偏向MYISAM存储引擎,开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发最低。

      • 整张表就只能一个人使用

      • 示例

        • 创建一个MYISAM引擎的表

        • 查看表有没有被加锁过

          • show open tables
            
        • 对表进行加锁

          • 加读锁

            lock table 表名 read
            
          • 加写锁

            lock table 表名 write 
            
        • 对表进行解锁

          unlock tables
          
      • 读写锁对操作和性能产生哪些影响

        • 加读锁
          • 当前连接
            • 可以读自己
            • 不能修改自己
            • 不能读别的表
          • 另一个连接
            • 可以读自己
            • 更新时处在阻塞状态,锁释放后执行
            • 可以读其他表
        • 加写锁
          • 当前连接
            • 可以读自己
            • 可以写自己
            • 不可以读别的表
          • 另外一个连接
            • 读自己,更新都处于堵塞状态
            • 可以读其他表
    • 行锁

      • 偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

      • 支持事务,采用了行级锁

      • 事务

        • ACID属性

          • 原子性(Atomicity)
            • 要么全成功,要么全失败
          • 一致性(Consistency)
            • 一个事务执行之前和执行之后都必须处于一致性状态,让数据保持一定的合理。比如一个商品出货时,仓库数量减1,对应用户的购物车中商品加1
          • 隔离性(lsolation)
            • 多个用户并发访问数据库,操作同一个表时,每一个用户开启的事务,不能别其他事务干扰
          • 持久性(Durability)
            • 一个事务提交之后,不能在回滚,已经存到数据库中
        • 事务的使用

          • 开启事务
            • start transaction
          • 回滚事务
            • rollback
          • 提交事务
            • commit
        • 并发处理带来的问题

          • 脏读
            • 脏读发生在一个事务读取了另一个事务改写但尚未提交的数据时。如果改写在稍后被回滚了,那么第一个事务获取的数据就是无效的
          • 不可重复读
            • 不可重复读发生在一个事务执行相同的查询两次或两次以上,但是每次都得到不同的数据时。这通常是因为另一个并发事务在两次查询期间进行了更新
          • 幻读
            • 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录
          • 对应关系在这里插入图片描述
        • 事务隔离级别

          • Read uncommitted
            • 就是一个事务可以读取另一个未提交的数据
          • Read committe
            • 一个事务要等另一个事务提交后才能读取数据
          • Repeatable read(系统默认)
            • 事务开启时,不在允许修改操作
          • Serializable(效率低,一般不用)
            • 事务串行化顺序执行
        • 查看隔离级别

          • select @@GLOBAL.tx_isolation,@@tx_isolation
            
            
        • 设置隔离级别

          • 全局

            set global transaction isolation level read uncommitted
            
          • 当前会话

            set session transaction isolation level read uncommitted
            
      • 索引失效,行锁变表锁

      • 间隙锁(锁住一定范围的数据)

      • 如何锁定一行数据

        • 加sql语句后面加上 for update
      • 查看行锁状态

        show status like 'innodb_row_lock%'
        
    • 页锁

    • 悲观锁

      • 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
    • 乐观锁

      • 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制
      • 实现方式(都是加一个字段,更新的时候先查出来,然后带上该条件)
        • 版本号
        • 时间戳

知是行之始,行是知之成

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值