美文网首页
mysql之事务隔离

mysql之事务隔离

作者: 每天进步一点点变成更好的自己 | 来源:发表于2022-03-18 12:12 被阅读0次

事务:保证一组数据库操作,要么全部成功,要么全部失败。事务支持,是在引擎层实现。

事务的四大特性ACID,分别是原子性、一致性、隔离性和持久性,其中隔离性是事务的基本特性之一,他可以防止数据库在并发处理时出现数据不一致的情况。

为了在正确性和效率之间进行平衡,我们设置不同的隔离等级。SQL标准的事务隔离级别包括:读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)、串行化(serializable)

  • 读未提交:别人改数据的事务尚未提交,我在我的事务中也能读到。
  • 读提交:别人改数据的事务已经提交,我在我的事务中才能读到。
  • 可重复读:别人改数据的事务已经提交,我在我的事务中也不去读。
  • 串行化:对于同一行记录,写会加写锁,读会加读锁,当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。即我的事务尚未提交,别人就别想改数据。
mysql> create table T(c int) engine=InnoDB;
insert into T(c) values(1);

问题:
1、事务并发处理可能存在的三种异常有哪些,什么是脏读、不可重复读和幻读?
2、针对可能存在的异常情况,四种事务隔离的级别分别是什么
3、如何使用MYSQL客户端来模拟脏读、不可重复读和幻读?

1、事务并发处理可能存在的异常都有哪些?

事务并发处理可能存在的异常包含3类:脏读(Dirty Read)、不可重复读(Nonrepeatable Read)、幻读(Phantom Read)。

  • 脏读:读到了其他事务还没有提交的数据。
  • 不可重复读:对数据进行读取,发现两次读取的结果不同,也就是说没有读到相同的内容。原因就是有其他事务对这个数据同时进行了修改和删除。
  • 幻读:事务 A根据条件查询到了N条数据,但此时事务B更改或增加了M条符合事务A查询条件的数据,A再次查询发现有N+M条数据,产生了幻读。

2、事务隔离的级别有哪些?

事务隔离从低到高分别是:

  • 读未提交 read uncommited
  • 读已提交 read commited【RDBMS常见的默认隔离级别,比如Oracle和SQL Server】
  • 可重复读 repeatable read【RDBMS常见的默认隔离级别,比如Mysql】
  • 可串行化 serializable

查询当前会话的隔离级别:mysql> SHOW VARIABLES LIKE 'transaction_isolation';
设置当前会话的隔离级别:

mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
mysql> SET autocommit = 0;
image.png

隔离级别的实现满足下面2个条件:
正确性:只要能满足某一个隔离级别,一定能解决这个隔离级别对应的异常问题。
与实现无关:实际上 RDBMS 种类很多,这就意味着有多少种 RDBMS,就有多少种锁的实现方式,因此它们实现隔离级别的原理可能不同,然而一个好的标准不应该限制其实现的方式。

image.png

相关文章

网友评论

      本文标题:mysql之事务隔离

      本文链接:https://www.haomeiwen.com/subject/nhmddrtx.html