Mysql事务的隔离级别,mysql事务隔离级别怎么实现的

Mysql事务的隔离级别,mysql事务隔离级别怎么实现的,MySQL事务的隔离级别详情

本文主要介绍MySQL事务的隔离级别细节。事务的隔离级别越高,避免冲突所需的性能越多,即效率越低。在“可重复读取”层面,实际上可以解决一部分虚拟读取的问题,但无法防止更新导致的虚拟读取问题。要禁止虚拟读取的生成,需要设置序列化隔离级别。

目录

一、隔离等级II的概念。测试TRANSACTION_READ_UNCOMMITTED隔离级别III。测试TRANSACTION_READ_COMMITTED隔离级别IV。测试TRANSACTION_REPEATABLE_READ隔离级别v .测试TRANSACTION_SERIALIZABLE隔离级别IV。

一、隔离级别的概念

为什么要考虑隔离级别?

因为事务是

并发执行

,而且并发执行可能会出现一些问题:脏读、不可重复读、虚拟读,有些是允许的,有些是不允许的,所以对于这种不同程度出现或不出现的并发控制有不同的隔离级别。

MySQL支持的四种隔离级别是:

事务_读取_未提交:

未提交读

.说明事务A在提交前可以看到事务B的变化。允许这种脏数据读取、不可重复读取和幻影读取。transaction _ read _ committed:

已提交读

(Oracle默认),表示不允许读取未提交的数据(防止脏读)。在这个级别,不可重复的读数和幻像读数仍然是允许的。transaction _ repeatable _ read:

可重复读

(MySQL默认),表示事务保证可以再次读取相同的数据而不会失败。即使其他事务改变了这个数据,你也不会看到前后查询的数据有什么不同。但是魔法阅读还是会出现。transaction _ serializable:

串行化

,最高的事务隔离级别,防止脏读、不可重复读和幻影读。串行执行,相当于单线程操作,

并发能力最低

注意:

事务隔离级别越高,避免冲突所需的性能越多,即效率越低。在“可重复读取”层面,实际上可以解决一部分虚拟读取的问题,但无法防止更新导致的虚拟读取问题。要禁止虚拟读取的生成,我们仍然需要设置序列化隔离级别。

MySQL客户端默认工作在可重复读级别:

二、测试TRANSACTION_READ_UNCOMMITTED隔离级别

此时如果客户端A回滚,数据库中张三的年龄恢复到20,此时为时已晚,因为客户端B已经取了21做业务。

两个客户端都回滚放弃对当前事务的数据所做的更改,张三的年龄恢复到20。

三、测试TRANSACTION_READ_COMMITTED隔离级别

因为设置了提交读隔离级别,所以事务B中不存在脏读,这是通过各种锁机制和事务并发的MVCC版本控制实现的。

已查询提交的数据,并且发生了不可重复的读取,这在提交的读取隔离级别是允许的。由于不可重复的读取发生,幻像读取肯定会发生。

四、测试TRANSACTION_REPEATABLE_READ隔离级别

可重复阅读在一定意义上可以防止幻影阅读的出现。可以看出,可重复读取的当前隔离级别阻止了插入。实际上,重新读取隔离级别可以防止插入和删除,但不能防止更新。

实际上,事务A已经被插入和提交,aaa已经存在,因为事务B已经成功地更新了AAA的年龄。

同一个查询前后两次,当最后一次查询的数据量与前一次查询的数据量不同时,就会出现幻影读取。也就是在可重复读取隔离级别下,幻影读取的问题还没有解决。要彻底解决幻影读取,有必要设置序列化隔离级别。

五、测试TRANSACTION_SERIALIZABLE隔离级别

从现象上看,连载可以解决魔读的问题。当您在相同条件下进行查询时,当您将数据插入到另一个表中时会被阻止。因为事务B在读数据,所以当事务A再次写数据时会被阻塞(用读写锁实现,允许读,但不允许读写)。

MySQL不会让自己执行事务的线程永远阻塞,导致当前线程占用的锁得不到释放,其他执行事务的线程得不到锁,永远阻塞。因此,执行事务的线程都有时间。当线程等待时间过长时,超时线程将释放锁,并返回一个错误:

这就是本文关于MySQL事务隔离级别的细节。有关MySQL事务隔离级别的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!

Mysql事务的隔离级别,mysql事务隔离级别怎么实现的