事务、提交、回滚、脏读、幻读等名词解释以及事务隔离级别详解
看视频的时候,听大佬说commit、事务、脏数据等等名词,听的弟弟是一脸懵呀,今天特地搜集、整理出来了这些名词的解释了,下面我们一起看一下。
文章目录
- 事务:transaction
- 概念
- 四个属性(ACID)
- 类型
- 事务的开始与结束---COMMIT、ROLLBACK
- 并发事务的四个问题
- 脏读(dirty read)
- 不可重复读(nonrepeatable read)
- 幻读(phantom read)
- 丢失更新(lost update)
- 解决办法
- 事务的隔离级别(4种)
- 介绍
- 事务隔离级别的查看和修改
- 四种隔离级别分别解决的问题
事务:transaction
概念
:
- 一个数据库事务由一条或者多条sql语句构成,它们形成一个逻辑的工作单元。这些sql语句要么全部执行成功,要么全部执行失败
- 事务是保证数据的完整性和一致性的重要手段
四个属性(ACID)
1、原子性:事务是由一个或一组相互关联的SQL语句组成,这些语句被认为是一个不可分割的单元,要么都成功要么全回滚。
2、一致性:对于数据库的修改是一致的,即多个用户查的的数据是一样的。一致性主要由mysql的日志机制处理,他记录数据的变化,为事务恢复提供跟踪记录。
3、隔离性:每个事务都有自己的空间,和其他发生在系统中的事务隔离开来,而且事务的结果只在他完全被执行时才能看到
4、持久性:但提交了这个事务之后对数据的修改更新就是永久的。当一个事务完成,数据库的日志已经被更新时,持久性即可发挥其特有的 功效,在mysql中,如果系统崩溃或者数据存储介质被破坏,通过日志,系统能够恢复在重启前进行的最后一次成功更新,可以反应系统崩溃时处于执行过程的事物的变化。
类型
- DML事务:由一条或者多条DML语句构成
- DDL事务:总是由一条DDL语句构成
- DCL事务:总是由一条DCL语句构成
但是在mysql中,系统变量@@autocommit默认是打开的,这意味着任何1条SQL语句都会开始一个事务,语句执行完后事务自动结束。所以说,实际使用中,应该使用SET语句来关闭自动提交,否则一个事务不可能由多条SQL语句构成
mysql> show variables like '%autocommit%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.01 sec)mysql>
如果有需要将自动提交关闭的话只需要将系统变量@@autocommit的值设置为0就可以了。
SET @@autocommit=0;
事务的开始与结束—COMMIT、ROLLBACK
- 事务的开始:
- 对于DML事务,在自动提交关闭的情况下,事务的开始分为隐式开始和显式开始:
隐式开始:程序的第一条DML语句执行时或者在COMMIT或ROLLBACK语句之后执行第一条DML语句时,自动开始一个新的事务 - 显式开始:发出STRAT TRANSACTION语句。该语句会自动关闭自动提交,当事务结束后,autocommit变量恢复到原来的值
###################################################################################################
- DML事务的结束
- COMMIT语句:成功提交。事务所做的全部工作被永久地保存到磁盘上
- ROLLBACK语句:失败回滚。事务所做的全部工作被撤销,表中的数据不受事务操作的影响
并发事务的四个问题
并发事务就是同时有多个事务访问同一个表
脏读(dirty read)
一个事务读到了另一个事务未提交的数据
不可重复读(nonrepeatable read)
在同一个事务中,同样的条件,你读取过的数据再次读取出来时发现值不一样了
示例:
- 在事务1中,Mary 读取了自己的工资为1000,事务没结束
- select salary from employee empId =‘Mary’;
- 在事务2中,财务人员修改了Mary的工资为2000,并提交了事务
- update employee set salary = 2000;
- commit;
- 在事务1中,Mary 再次读取自己的工资时,工资变为了2000
- select salary from employee empId =‘Mary’;
幻读(phantom read)
在同一个事务中,同样的条件,第1次和第2次读出来的记录数不一样
示例:
- 在事务1中,读取所有工资为1000的员工(10人)
- select * from employee where salary =1000;
- 在事务2中,向employee表插入了一条员工记录,工资也为1000 ,并提交
- Insert into employee(empId,salary) values(‘zs’,1000);
- commit;
- 事务1再次读取所有工资为1000的员工(11人)
- select * from employee where salary =1000;
不可重复读和幻读,两者都表现为两次读取的结果不一致。
区别是:不可重复读的重点是修改,幻读的重点在于新增或者删除
丢失更新(lost update)
一个事务的修改覆盖了另一个事务所做的修改
示例:
- 事务1读取4号球员的罚款额,为50
- 事务2读取4号球员的罚款额,也为50
- 事务1把罚款额增加25,并提交
- Update penalties set amount=amount + 25;
- Commit;
- 事务2把罚款额增加30,并提交
- Update penalties set amount=amount + 30;
- Commit;
- 此时,事务1认为最新的罚款额为75,但是实际上是80,事务1所做的更新操作被事务2覆盖掉了。事务1的更新丢失了
解决办法
以上所有的4个问题都可以通过不允许两个用户同时运行一个事务来很容易的解决掉:
- 用户1的事务没有结束,用户2的事务就不能开始,这样就不会出错了
- 但是这样的话,数据库的并发性能极差,不能接受
为保证多个线程获取数据库中数据的准确性,就出现了“事务隔离性这个名词”
事务的隔离级别(4种)
当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性,下面看看四种隔离界别
介绍
1、READ UNCOMMITTED(未提交读/脏读)
(1)、该隔离级别的事务,在数据修改过程中,即使没有提交,其他事务对于这些数据也是可读的。事务可读到未提交的数据也叫脏读(Dirty Read),由于脏读在实际应用中会导致很多问题,一般这类隔离级别应用很少。
2、READ COMMITTED(不可重复读/提交后读)
(1)、不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
(2)、(一般数据库默认事务级别)只有当前事务执行完,把数据提交之后,其他事务才可对这些数据进行读取。也叫不可重复读,因为其他事务执行2次查询可能前后会得到2个不同结果(事务执行前读一次,执行后读一次)。
3、REPEATABLE READ(可重读/幻读)
(1)、幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
(2)、(Mysql的默认隔离级别)解决了脏读的问题,该级别保证了在同一事务中,多次读取的结果是一致的。但仍旧无法解决幻读问题。幻读:事务A在读取一定范围内数据时,事务B有对该范围数据进行插入等更新操作,事务A再次读取该范围记录时,会产生幻读。
4、SERIALIZABLE(序列化/串行化)
(1)、在读取每一行数据的时候都对该行数据加锁,强制事务串行执行,在事务提交的时候会释放锁,这时其他事务才能获取相关数据的锁进行处理这样避免了幻读问题,隔离性达到了最高但是这种执行方式效率 低,锁竞争激烈容易出现超时问题。
只有在对数据一致性要求很强的时候和没有并发或并发量很小的时候使用!
事务隔离级别的查看和修改
查看数据库及当前会话的事务隔离级别
SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
分别设置数据库及当前会话的事务隔离级别
SET GLOBAL tx_isolation='REPEATABLE-READ';
SET SESSION tx_isolation='SERIALIZABLE';
四种隔离级别分别解决的问题
(1)、Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
(2)、Repeatable read (可重复读):可避免脏读、不可重复读的发生。
(3)、Read committed (读已提交):可避免脏读的发生。
(4)、Read uncommitted (读未提交):最低级别,任何情况都无法保证。
事务、提交、回滚、脏读、幻读等名词解释以及事务隔离级别详解相关推荐
- Spring 事务提交回滚源码解析
2019独角兽企业重金招聘Python工程师标准>>> 前言 在上篇文章 Spring 事务初始化源码分析 中分析了 Spring 事务初始化的一个过程,当初始化完成后,Spring ...
- sql事务提交回滚命令_提交,回滚和保存点SQL命令
sql事务提交回滚命令 Transaction Control Language(TCL) commands are used to manage transactions in the databa ...
- MySQL事务及隔离级别详解
MySQL事务及隔离级别详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的基本架构 MySQL的基本架构可以分为三块,即连接池,核心功能层,存储引擎层. 1> ...
- SQL Server事务隔离级别详解
SQL Server事务隔离级别详解 标签: SQL SEERVER/MSSQL SERVER/SQL/事务隔离级别选项/设置数据库事务级别 SQL 事务隔离级别 概述 隔离级别用于决定如果控制并发用 ...
- SQL Server-聚焦事务、隔离级别详解(二十九)
前言 事务一直以来是我最薄弱的环节,也是我打算重新学习SQL Server的出发点,关于SQL Server中事务将分为几节来进行阐述,Always to review the basics. 事务简 ...
- mysql事务实战_mysql事务隔离级别详解和实战
A事务做了操作 没有提交 对B事务来说 就等于没做 获取的都是之前的数据 但是 在A事务中查询的话 查到的都是操作之后的数据 没有提交的数据只有自己看得到,并没有update到数据库. 查看InnoD ...
- mysql事务隔离级别详解_高性能MySQL-详解事务与隔离级别
本文主要包括一下内容: (1) 事务的概念与ACID (2)事务的隔离级别 (3)MySQL中的事务 1. 事务与ACID 理解事务是其它高级概念的基础.事务:事务就是一组原子性的SQL查询,或则说是 ...
- mysql排他锁释放_Mysql 共享锁、排他锁 与 事务隔离级别详解
共享锁.排他锁 InnoDB 实现了两种类型的锁机制:共享锁(S)和排他锁(X).共享锁允许一个事务读数据,不允许修改数据,如果其他事务要再对该行加锁,只能加共享锁:排他锁是修改数据时加的锁,可以读取 ...
- MYSQL事务隔离级别详解附加实验
参考: https://dev.mysql.com/doc/refman/5.7/en/set-transaction.html http://xm-king.iteye.com/blog/77072 ...
最新文章
- python求交点坐标_Python求两个圆的交点坐标或三个圆的交点坐标方法
- 每日一笑 | 程序员的日常,这也太真实了......
- disabling directory browsing
- GitHub如何在README.md文件中插入图片
- 配置不成功_在windows下配置sendmail服务器
- GFP_KERNEL的作用
- 刘意JavaSE 学习笔记 Day12-Day14——字符串API(String/StringBuffer/StringBuilder...)
- 通俗易懂谈强化学习之Q-Learning算法实战
- mybatis传递pojo类学习
- 推荐一个网站:编程资料网 http://www.ourdev.net/
- 怎样做文献综述:六步走向成功-读书笔记
- 8421BCD码与十进制的转换
- (六)jmeter接口自动化难点系列---jmeter使用base64解密
- OPENSTACK-210-3-配置网络(Configure networking)-命令行
- 1. 抽纸片(java)
- Hadoop之——Hadoop3.x端口变动
- SQL Server AlwaysON从入门到进阶(3)——基础架构
- 基于浮云绘图 快速开发车站状态图
- VSCode代码格式化快捷键及保存时自动格式化
- c语言两个for语句并列执行_c语言中for循环 和嵌套for循环
热门文章
- 计算机音乐烟火人间,烟火人间在线试听_陆虎_高音质歌曲_九酷音乐
- Yac - PHP扩展
- 不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事...
- 计算机网络辅助英语写作,计算机网络及课件辅助大学英语写作教学的研究
- leetcode 剑指offer-46.把数字翻译成字符串
- 2合1笔记本 android,安卓,视窗,双系统二合一平板笔记本
- Fragment中使用listview
- 回顾下自己的学习历程
- 1.2医学统计学的作用
- C#静态(ststic)