MySQL 锁

2021/4/15 19:55:13

本文主要是介绍MySQL 锁,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

锁:

硬锁有两种,共享锁和排它锁;

  • 共享锁
  1. 确保某个事务查到最新的数据;
  2. 这个事务不需要对数据进行修改、删除等操作;
  3. 也不允许其它事务对数据进行修改、删除等操作;
  4. 其它事务也能确保查到最新的数据。
  • 排它锁
  1. 确保某个事务查到最新的数据;
  2. 并且只有该事务能对数据进行修改、删除等操作。
  • 死锁:

死锁是指两个或两个以上的事务在执行过程中,因争夺资源而造成的一种互相等待的现象。

  • 串行化:

串行化是指将对象的状态转换成可以存储、传送的形式的过程

事务隔离的原理是什么?加锁;

怎么加?

数据库遵循两段锁协议,将事务分成两个阶段,分别为:

  • 加锁阶段:

在该阶段可以进行加锁操作。在对任何数据进行读操作之前要申请并获得S锁(共享锁,其它事务可以继续加共享锁,但不能加排它锁),在进行写操作之前要申请并获得X锁(排它锁,其它事务不能再获得任何锁)。加锁不成功,则事务进入等待状态,直到加锁成功才继续执行。

  • 解锁阶段:

当事务释放了一个封锁以后,事务进入解锁阶段,在该阶段只能进行解锁操作不能再进行加锁操作。

四种隔离级别分别是怎么加锁的:

  • 读未提交:不加锁;
  • 读已提交:读取不加锁,写入、修改、删除加锁;
  • 可重复读:

两个概念:悲观锁、乐观锁;

  • 悲观锁:
    对数据被外界修改持保守态度,也就是S锁、X锁这样的硬锁如果采用这种方式的话,为了保持事务隔离性,读取修改和删除都需要加锁;

  • 乐观锁:
    也就是MVCC,对数据被外界修改持开放态度,并不抗拒于外界数据的改变,而是通过版本号的对照来实现事务的隔离性,实质上并不算是锁,但能和锁发挥一样的功能;

  • 快照读:
    读历史数据。InnoDB中事务的select操作就是用的快照读,之前说到过当数据更新后MVCC为了保持可重复读的隔离等级会回滚到历史记录快照读会导致读取的数据过期等问题;

  • 当前读:
    读取的是最新版本数据,也就是insert、update、delete,当我们执行这三个操作时实际上数据库中的数据已经是过期的了,我们进行更新的才是最新的;

可重复读中的读锁通过MVCC实现,而写锁则通过next-key lock实现;

  • 可串行化:读加共享锁,写加排他锁,读写互斥。

四种隔离等级的加锁方式各有长短,具体怎么加视情况而定;

吃水不忘挖井人:https://blog.csdn.net/qq_35246620/article/details/61200815



这篇关于MySQL 锁的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程