MySQL 的事务隔离级别

马谦马谦马谦 MySQL评论256字数 1297阅读 4 分 19 秒阅读模式

一、事务并发带来的问题

1.1 第一类丢失更新

两个事务同时更新一行数据,第一个事务正常更新,第二个事务中途退出回滚数据到初始状态,导致第一个事务更新失效。

如:银行卡存储了用户甲的余额 4000,此时事务 A 和 B 同时开始更新余额,事务 A 将余额更新到 5000 后正常退出,事务 B 执行出错导致更新失败,然后回滚余额到开始的状态 4000 。于是就产生了第一类丢失更新

1.2 第二类丢失更新

和上面第一类丢失更相反,第二类丢失更新的意思是事务 B 更新了数据,但是事务 A 退出导致数据回滚,事务 B 更新失效。

1.3 脏读

事务 A 更改了数据未提交,事务 B 读取数据,然后事务 A 回滚,此时事务 B 进行了一次脏读。

如:

小张银行卡余额为 5000 元,这天财务处发了 4000 工资,小张一看余额有 9000 元,非常高兴的把卡给了老婆并说这卡里有 9000 块。但是这时财务处发现工资发错人了,先扣回了 4000 工资。这个过程中小张就于执行了一次脏读,随之而来的就是老婆的一顿暴打。。。

1.4 不可重复读

一个事务,多次读同一个数据。在这期间另外一个事务对数据进行了修改并提交,导致事务前后读数据不一致。

例如:事务 A 给读取用户工资为 5000,事务 B 修改工资为 8000 并提交,此时事务 A 再次读工资发现工作变成了 8000,两次读取数据不一致,导致不可重复读。

1.5 幻读

事务 A 执行了一个包含多行数据的查询,例如计算符合条件的记录数量,事务 B 添加或者删除一行并提交,事务 A 再次读取记录数量就发生了变化,造成幻读。

例如:事务 A 查询工资高于 8000 的员工数量有 10 个,事务 B 添加了一个新纪录工资为 9000 并提交。此时事务 A 再次查询工资高于 8000 的员工数量为 11,比之前多出一行记录,产生幻读。

二、事务的隔离级别

1. READ_UNCOMMITTED

事务最低的隔离级别,它充许另外一个事务可以看到这个事务未提交的数据。

解决第一类丢失更新的问题,但是会出现脏读、不可重复读、第二类丢失更新的问题,幻读。

2. READ_COMMITTED

保证一个事务修改的数据提交后才能被另外一个事务读取,即另外一个事务不能读取该事务未提交的数据,oracle 默认隔离级别。

解决第一类丢失更新和脏读的问题,但会出现不可重复读、第二类丢失更新的问题,幻读问题。

3. REPEATABLE_READ

保证一个事务相同条件下前后两次获取的数据是一致的,mysql 默认隔离级别 。

解决第一类丢失更新,脏读、不可重复读、第二类丢失更新的问题,但会出幻读。

4. SERIALIZABLE

事务被处理为顺序执行,一次只会执行一个事务。

解决所有问题,效率低。

5. 汇总

隔离级别 第一类丢失更新 第二类丢失更新 脏读 不可重复读 幻读
READ_UNCOMMITTED × × × ×
READ_COMMITTED × × ×
REPEATABLE_READ ×
SERIALIZABLE

三、查看和修改隔离级别

3.1 查看当前隔离级别

MySQL 的默认隔离级别是 PEPEATABLE_READ

MySQL的事务隔离级别

3.2 设置隔离级别

  最后更新:2020-1-12
马谦马谦马谦
  • 本文由 马谦马谦马谦 发表于 2017 年 11 月 22 日 21:48:45
  • 转载请务必保留本文链接:https://www.dyxmq.cn/databases/mysql/mysql-transaction-level-lock.html
linux环境下安装Mariadb Linux

linux 环境下安装 Mariadb

一、下载安装 mariadb 是属于 mysql 的一个分支,是其创始人在 mysql 被卖给 oracle 之后重新分出来的,maria 取自于他女儿的名字。 mariadb 完全兼容于 mysql,在很多新版本的 lin...
使用二进制包安装MySQL CentOS

使用二进制包安装 MySQL

二进制包安装 MySQL 的步骤和源码编译安装的步骤差不多,只是少了编译的流程,直接解压就能使用,相对方便很多。 一、安装步骤 创建用户和安装依赖项: # 创建用户 > useradd -s /sb...
MySQL中的unique和primary key MySQL

MySQL 中的 unique 和 primary key

primary key 用于标识主键,字段被设置为主键后该字段所有值不可重复且不能为 null,每个表仅可有一个主键。 unique 设置字段不可重复,但不包括 null 值,每张表可以有多个 unique 字段,n...
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
确定

拖动滑块以完成验证