MySQL锁

文章目录

      • 一、数据库锁知识
      • 二、分类
        • 1、锁的粒度分类
        • 2、表锁
        • 3、行锁
        • 4、[事务的隔离级别](https://github.com/hongwen1993/all/blob/master/database/Isolation.md)

参考: MySQL锁详细讲解
MySQL锁_第1张图片

一、数据库锁知识

在开发的时候,应该很少会注意到这些锁的问题,也很少会给程序加锁(除了库存这些对数量准确性要求极高的情况下),即使我们不会这些锁知识,我们的程序在一般情况下还是可以跑得好好的。因为这些锁数据库隐式帮我们加了,只会在某些特定的场景下才需要手动加锁。

  • 对于UPDATE、DELETE、INSERT语句,InnoDB会自动给涉及数据集加排他锁(X)
  • MyISAM在执行查询语句SELECT前,会自动给涉及的所有表加读锁,在执行增、删、改操作前,会自动给涉及的表加写锁,这个过程并不需要用户干预。

二、分类

1、锁的粒度分类

从锁的粒度,我们可以分成两大类:

  • 表锁
    开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低
  • 行锁
    开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高

InnoDB行锁和表锁都支持、MyISAM只支持表锁InnoDB只有通过索引条件检索数据才使用行级锁,否则,InnoDB使用表锁也就是说,InnoDB的行锁是基于索引的!

2、表锁

读读不阻塞,读写阻塞,写写阻塞!
MySQL锁_第2张图片
从上面已经看到了:读锁和写锁是互斥的,读写操作是串行,写锁是优先于读锁

3、行锁

InnoDB和MyISAM有两个本质的区别:InnoDB支持行锁、InnoDB支持事务

InnoDB行锁分类:

  • 共享锁(S锁、读锁):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。即多个客户可以同时读取同一个资源,但不允许其他客户修改
  • 排他锁(X锁、写锁):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的读锁和写锁。写锁是排他的,写锁会阻塞其他的写锁和读锁
4、事务的隔离级别

事务的隔离级别就是通过锁的机制来实现,锁的应用最终导致不同事务的隔离级别,只不过隐藏了加锁细节,事务的隔离级别有4种:

  • 未提交读(read-uncommitted):最低级别,基本只保证持久性;会出现脏读,不可重复读,幻读的问题。
  • 已提交读(read-committed):语句级别;会出现不可重复读,幻读的问题。
  • 可重复读(repeatable-read):事务级别;只会出现幻读问题。
  • 串行化(serializable):最高级别,也就是事务与事务完全串行化执行,无并发可言,性能低;但不会出现任何问题。

你可能感兴趣的:(Mysql,mysql,数据库)