天天看点

7-Mysql 进阶-锁机制

锁的介绍
  • 锁机制: 数据库为了保证数据的一致性,在共享的资源被并发访问时变得安全所设计的一种规则
  • 锁机制类似多线程中的同步,作用就可以保证数据的一致性和安全性
  • 按操作类型分类

    共享锁: 也就读锁,针对同一份数据,多个事务读取操作可以同时加锁而不互相影响,但是不能修改数据

    排它锁: 也叫写锁,当前的操作没完成之前,会阻断其他操作的读取和写入操作

  • 按粒度分类

    表级锁: 会锁定整个表,开销小,加锁快,锁定粒度大,发生锁冲突概率高,并发度低,不会出现死锁情况

    行级锁: 会锁定当前行,开销大,加锁慢.锁定粒度小,发生锁冲突概率低,并发度高,会出现死锁情况

  • 按使用方式分类

    悲观锁: 每次查询数据时都会认为别人会修改,很悲观,所以查询时加锁

    乐观锁: 每次查询时都认为别人不会修改,很乐观,但是更新时会判断一下在此期间时别人有没有取更新这个数据

  • 不同存储引擎支持的锁
  • 7-Mysql 进阶-锁机制
  • 不同存储引擎支持的锁
InnoDB 共享锁
  • 共享锁特点

    数据可以别多个事务查询,但是不能被修改

  • 创建共享锁格式

    ​​

    ​SELECT 语句 LOCK IN SHARE MODE​

InnoDB 排它锁
  • 排它锁特点

    加锁的数据,不能被其他事务加锁查询或修改

  • 创建排它锁格式

    ​​

    ​SELECT 语句 FOR UPDATE;​

  • 读锁特点

    所有链接只能查询数据,不能修改

  • 读锁语法格式

    加锁:​​

    ​LOCK TABLE 表名 READ;​

    解锁:```UNLOCK TABLES;

  • 写锁特点

    其他链接不能查询和修改数据

  • 写锁语法格式

    加锁:​​

    ​LOCK TABLE 表名 WRITE;​

    ​​

    解锁:​

    ​UNLOCK TABLES;​

  • 悲观锁

    就是很悲观,它对于数据被外界修改的操作持保守态度,认为数据随时会修改。整个数据处理中需要将数据加锁。悲观锁一般都是依靠关系型数据库提供的锁机制。我们之前所学的锁机制都是悲观锁。

  • 乐观锁

    就是很乐观,每次自己操作数据的时候认为没有人会来修改它,所以不去加锁。但是在更新的时候会去判断在此期间数据有没有被修改。需要用户自己去实现,不会发生并发抢占资源,只有在提交操作的时候检查是否违反数据完整性。