当前位置:首页 > 编程技术 > 正文内容

MySQL 事务特性和事务隔离级别

yc8881年前 (2022-12-11)编程技术332

1. MySQL 事务的四大特性


MySQL 事务具有四个特性:原子性、一致性、隔离性、持久性,这四个特性简称 ACID 特性

一、原子性(Atomicity ):一个事务是一个不可再分割的整体,要么全部成功,要么全部失败

事务在数据库中就是一个基本的工作单位,事务中包含的逻辑操作(SQL 语句),只有两种情况:成功和失败。事务的原子性其实指的就是这个逻辑操作过程具有原子性,不会出现有的逻辑操作成功,有的逻辑操作失败这种情况

二、一致性(Consistency ):一个事务可以让数据从一种一致状态切换到另一种一致性状态

举例说明:张三给李四转账 100 元,那么张三的余额应减少 100 元,李四的余额应增加 100 元,张三的余额减少和李四的余额增加这是两个逻辑操作具有一致性

三、隔离性(Isolution ):一个事务不受其他事务的影响,并且多个事务彼此隔离

一个事务内部的操作及使用的数据,对并发的其他事务是隔离的,并发执行的各个事务之间不会互相干扰

四、持久性(Durability ):一个事务一旦被提交,在数据库中的改变就是永久的,提交后就不能再回滚

一个事务被提交后,在数据库中的改变就是永久的,即使系统崩溃重新启动数据库数据也不会发生改变

2. MySQL 事务的并发问题


上面讲到了事务的隔离性,当有多个任务时,应当让多个事务同时执行,这就是事务的并发。既然事务存在并发执行,那必然存在两个事务操作同一个数据的冲突问题,那么我们来看一下会出现哪些问题

下面介绍脏读、不可重复读、幻读时会涉及到事务隔离级别,可先略过。按照提示设置事务隔离级别即可,本文后面会介绍事务隔离级别。测试这几个事务并发问题可以通过打开两个终端窗口进行测试

查看事务隔离级别

  1. select @@transaction_isolation;

一、脏读

测试脏读: 将事务隔离级别修改为读未提交

  1. # READ-UNCOMMITTED 读未提交
  2. set session transaction isolation level read uncommitted;

现在有两个事务,分别是事务 A 和事务 B。在事务 A 中查询一条数据,查询结果中 score 的值是 80,然后事务 B 去修改这一条数据,将 score 的值改为 90,但是它没有提交,这时候事务 A 去查询这条数据,发现数据竟然发生了变化。

脏读: 在一个事务里面,由于其他事务修改了数据并且没有提交,而导致前后两次读取的数据不一致的情况,这种事务并发问题称之为 “脏读”

二、不可重复读

测试不可重复读: 将事务隔离级别修改为读已提交

  1. # READ-COMMITTED 读已提交
  2. set session transaction isolation level read committed;

同样是两个事务,事务 A 查询一条数据,事务 B 修改了这条数据,特别注意,这里事务 B 执行了提交,但是事务 A 还没有提交或回滚,这种事务并发问题称为不可重复读

不可重复读: 一个事务读取到其他事务已提交的数据导致前后两次读取数据不一样的情况

三、幻读

测试可重复读: 将事务隔离级别修改为可重复读

  1. # REPEATABLE-READ 可重复读(默认的事务隔离级别)
  2. set session transaction isolation level repeatable read;

幻读: 一个事务前后两次读取的数据不一致,是因为其他事务插入数据导致的事务并发情况

3. MySQL 事务的隔离级别


MySQL 事务有四种隔离级别,如下所示,表格中的 “是” 代表存在这个问题,“否” 代表没有这个问题

隔离级别 脏读 不可重复读 幻读
Read uncommitted(读未提交)
Read committed(读已提交)
Repeatable read(可重复读,默认的隔离级别)
Serializable(可串行化)

查看事务隔离级别

  1. # 查看全局事务隔离级别
  2. select @@global.tx_isolation;
  3. # 查看会话事务隔离级别(也就是当前窗口)
  4. select @@tx_isolation;
  5. select @@transaction_isolation;

设置事务隔离级别

  1. # 读未提交
  2. set session transaction isolation level read uncommitted;
  3. # 读已提交
  4. set session transaction isolation level read committed;
  5. # 可重复读(默认隔离级别)
  6. set session transaction isolation level repeatable read;
  7. # 可串行化
  8. set session transaction isolation level serializable;

总结:

MySQL 的默认隔离级别是可重复读,不是读已提交

隔离性从低到高分别是:读未提交、读已提交、可重复读、可串行化

并发性跟隔离性恰好相反,从低到高是:可串行化、可重复读、读已提交、读未提交

这也非常好理解,隔离性越高,说明锁的粒度越细,并发性自然就会降低

本站发布的内容若侵犯到您的权益,请邮件联系站长删除,我们将及时处理!


从您进入本站开始,已表示您已同意接受本站【免责声明】中的一切条款!


本站大部分下载资源收集于网络,不保证其完整性以及安全性,请下载后自行研究。


本站资源仅供学习和交流使用,版权归原作者所有,请勿商业运营、违法使用和传播!请在下载后24小时之内自觉删除。


若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,使用者自行承担,概与本站无关。


本文链接:https://www.10zhan.com/biancheng/10208.html

标签: MySQL
分享给朋友:

“MySQL 事务特性和事务隔离级别” 的相关文章

【说站】利用Webhook实现Java项目自动化部署

【说站】利用Webhook实现Java项目自动化部署

用webhook就能实现Java项目自动部署,其实原理很简单。费话不多说,直接往下看教程。1. 创建gitee仓库并初始化2. 在linux安装git3. 在宝塔的软件的商店里下载Webhook4....

【说站】C#在PDF中添加墨迹注释Ink Annotation的步骤详解

【说站】C#在PDF中添加墨迹注释Ink Annotation的步骤详解

PDF中的墨迹注释(Ink Annotation),表现为徒手涂鸦式的形状;该类型的注释,可任意指定形状顶点的位置及个数,通过指定的顶点,程序将连接各点绘制成平滑的曲线。下面,通过C#程序代码介绍如何...

【说站】Java从resources读取文件内容的方法有哪些

【说站】Java从resources读取文件内容的方法有哪些

本文主要介绍的是java读取resource目录下文件的方法,比如这是你的src目录的结构├── main│ ├── java│ │ └── ...

【说站】linux中redis如何以redis用户重启?

【说站】linux中redis如何以redis用户重启?

通过上图我们可以看到,目前状态是已经以 redis 用户启动着,我想修改下 redis 的密码,然后怎么以 redis 用户重启呢?redis 是 nologin 用户,不能通过 su redis 切...

【说站】PHP使用Openssl实现本地生成csr、key、crt证书文件

【说站】PHP使用Openssl实现本地生成csr、key、crt证书文件

在Apache中要启用HTTPS访问,需要开启Openssl,也就需要crt和key两个和证书相关的文件了,那如果用制作呢?之前发过博文介绍过用在线生成的方式,但搞PHP编程的人有些东西还是想在自己的...

【说站】jenkins配置ssh服务器并配置ssh servers

【说站】jenkins配置ssh服务器并配置ssh servers

1.系统管理-》配置-》Publish over SSH当然,没有这个插件的第一时间去插件管理里面去下载2.生成秘钥任意找一台服务器,生成即可。2.1已有秘钥无须在生成,只需要吧公钥配置到将要配置的s...