MySQL事务隔离级别锁相关的详解

MySQL InnoDB引擎中的事务详解!

事务就是可以使一组操作要么全部成功要么全部失败,事务的目的是为了 保证数据的最终一致性

举个例子:

张三给李四的微信转了1000块红包。那自然李四的微信余额会扣减1000块,而李四的微信余额上添加1000块(前提是李四接收了转发😂);而事务就是保证张三的余额上扣除1000的同时在李四的余额上增加了1000,这两个操作要么同是成功,要么同时失败,不能在张三的余额上扣了,但是李四的余额上增加失败,也不能在李四的余额上增加了但是张三的没扣。

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔离性(Isolation)
  • 持久性(Durability)

自己的理解,还需要查阅资料然后去确定!!!😁😁

原子性:指的是原子性不可再分,(😵) 当前事务的操作要么同时成功要么同时失败。原子性由undo log 日志来保证,因为undo log日志记载着数据修改之前的信息。比如我们insert一条数据了,那undo log 会记录之前的旧值 的update记录,如果执行事务的过程中出现了异常的情况,那执行回滚。InnoDB 引擎就是利用undo log 记录下的数据,来将数据恢复到事务开始之前。

原子性:要么同时成功要么同时失败,底层依赖undo log实现

隔离性指的是:在事务并发执行时,他们的内部操作不能互相干扰。如果多个事务可以同时操作一个数据,那么就会出现脏读,重复读,幻读等问题。

综上所述 事务与事务之间是需要一定的隔离的。在InnoDB存储引擎中,定义了四种隔离级别:

  • read uncommit(读未提交)
  • read commit (读已提交)
  • repeatable read (可重复复读)
  • serializable (串行)

不同的隔离级别对事务的隔离程度是不同的,级别越高,隔离性越好,性能相对越低MySQL事务的隔离是通过锁来实现的只是它隐藏了加锁的细节!

持久性:指的就是一旦提交了事务,它对数据库的影响就是永久性的。说白了就是,会将数据持久化到硬盘上。

持久性由redo log日志来保证,当我们要修改数据时,MySQL是先把这条记录所在的 页 找到,然后把该页加载到内存中,将对应的记录进行修改。为了防止内存修改完了MySQL就挂了(如果内存改完MySQL就挂了,那么这次的修改相当于就丢失了)。

MySQL引入了redo log 内存写完了,然后会写一份redo log ,这份redo log 记载着这次在某个页上做了什么修改。

即便MySQL在中途挂了,我们还可以根据redo log 来对数据进行恢复。redo log是顺序写的,写入速度很快。并且他记录的是物理的修改(xxx页做了xxxx修改),文件体积小,恢复速度也很快。

持久性:一旦提交了事务,数据是永久性的记录的MySQL的底层使用的是redo log 来持久化数据。

一致性就是我们使用事务的目的!保证一致性是需要由应用程序代码来保证,比如,如果事务在发生的过程中,出现了异常的情况,此时你就得回滚事务,而不是强行将事务进行提交来导致数据不一致!

首先理解隔离级别需要理解锁的相关知识:

在InnoDB引擎下,按锁的粒度分类,可以简单地将所分为行锁和表锁。当我们的SQL命中了索引,那锁住的就是命中条件内的索引节点(这种就是行锁),如果没有命中索引,那我们锁的就是整个索引树(表锁)。

简单来说就是:锁住的是整棵树还是某几个节点,完全取决于SQL条件是否有命中到对应的索引节点。

行锁又可以简单分为读锁(也就是共享锁)和写锁(排他锁)。

以一个邮箱中的邮件为例是可以多个人一起读的,读锁 多个事务是可以读取同一个资源。

还是上面的例子在一个邮箱中不能多个人同时修改同一个邮件这显然是不行的!所以当一个事务在修改数据时其他的事务只能阻塞(等待)

在InnoDB引擎下命中了索引是行锁,不命中则是表锁

就是一个事务还未提交的数据被别的事务读取到,简单点说就是事务A还未提交的数据被事务B读取到,专业术语叫 脏读

对于锁的维度而言,其实就是在 read uncommit隔离级别下,😵读不会加任何的锁,而写会加排它锁。读什么锁都不加,这就让排它锁无法排他了(??什么鬼,怎么回事呢?)而我们又知道,对于更新操作而言,InnoDB是肯定会加写锁的(数据库是不可能允许在同一时间,更新同一条记录的)。而读操作,如果不加任何锁,那就会造成上面的脏读。😭
脏读在实际开发中是难以忍受的,如果读加锁的话,那意味着:当更新数据时,就没有办法读取了,这会极大降低数据库的性能。
在MySQL的引擎层面又有新的解决方案(解决加锁后读的性能问题),也叫MVCC(Multi-Version Concurrency Control)多版本并发控制

MVCC 提高读写性能,多版本并发控制

MVVC下可以做到读写不阻塞,并且避免了类似脏读的问题。那么MVCC如何做到的呢??
MVCC通过生成数据快照(Snapshot),并用这个快照来提供一定级别(语句级或事务级)的一致性读取。
回到事务隔离级别下,针对于 read commit (读已提交) 隔离级别,它生成的就是语句级快照,而针对于repeatable read (可重复读),它生成的就是事务级的快照。

Original: https://www.cnblogs.com/kobedu/p/16211552.html
Author: kobedu
Title: MySQL事务隔离级别锁相关的详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/587253/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球