MYSQL数据库事务4种隔离级别及7种传播行为
事务的特性:
原子性:事务的不可分割,组成事务的各个逻辑单元不可分割。
一致性:事务执行的前后,数据完整性保持一致。
隔离性:事务执行不应该受到其他事务的干扰。
持久性:事务一旦结束,数据就持久化到数据库中。
查看/设置隔离级别
查看:SELECT @@tx_isolation 设置:set tx_isolation='xxx'
事务的隔离级别
如果不考虑隔离性,引发一些安全问题
隔离性:一个事务的执行,不应该受到其他事务的干扰。
脏读:一个事务读到了另一个事务未提交的数据,导致查询结果不一致
不可重复读:一个事务读到了另一个事务已经提交的update的数据,导致多次查询结果不一致。
虚读/幻读:一个事务读到了另一个事务已经提交的insert的数据,导致多次查询结果不一致。
设置事务的隔离级别:
read uncommitted (读取未提交内容) :脏读,不可重复读,虚读都有可能发生
read committed (读取提交内容) :避免脏读。但是不可重复读和虚读是有可能发生
repeatable read (可重读) :避免脏读和不可重复读,但是虚读有可能发生。
serializable(可串行化) :避免脏读,不可重复读,虚读。
通过实例演示四种隔离级别
read uncommitted (读取未提交内容) :
事务A:开启事务并执行 SELECT * FROM testtest, 但并不提交事务
set tx_isolation='read-uncommitted';
start transaction;
SELECT * FROM testtest;
结果显示:
事务B:开始事务并执行 UPDATE testtest set age = 200 WHERE name = 'zhangsan'; 但并不提交事务
start transaction;
UPDATE testtest set age = 200 WHERE name = 'zhangsan';
事务A:再次执行 SELECT * FROM testtest
在事务B未提交的情况下,仍然读到了修改的200,出现了脏读!
read committed (读取提交内容)
事务A:开启事务并执行 SELECT * FROM testtest, 但并不提交事务
事务B:开始事务并执行 UPDATE testtest set age = 200 WHERE name = 'zhangsan'; 但并不提交事务
start transaction;
UPDATE testtest set age = 200 WHERE name = 'zhangsan';
事务A:再次执行 SELECT * FROM testtest
在事务B未提交的情况下,没有读到修改的200,避免了脏读!
事务B:提交事务。
事务A:再次执行 SELECT * FROM testtest
在事务B提交的情况下,读到了修改的200,出现了不可重复读!(同一个事务中多次读取结果不一致)
repeatable read (可重读) mysql默认
事务A:开启事务并执行 SELECT * FROM testtest, 但并不提交事务
事务B:开始事务并执行 UPDATE testtest set age = 200 WHERE name = 'zhangsan'; 但并不提交事务
start transaction;
UPDATE testtest set age = 200 WHERE name = 'zhangsan';
事务A:再次执行 SELECT * FROM testtest
在事务B未提交的情况下,没有读到修改的200,避免了脏读!
事务B:提交事务。
事务A:再次执行 SELECT * FROM testtest
在事务B提交的情况下,没有读到修改的200,避免了不可重复读!
再次 开启事务B,并添加一条记录,并提交事务
start transaction;
INSERT INTO testtest(name,age) VALUES ('wangwu','100');
COMMIT;
事务A:再次执行 SELECT * FROM testtest
并没有读到新增的记录
事务A:插入刚才事务B新增的记录
INSERT INTO testtest(name,age) VALUES ('wangwu','100');
发现插不进去,因为事务B已经添加并提交事务了(我们name字段做了唯一索引),出现了幻读!(查询的时候没有,但插入的时候确实存在,跟出现幻觉一样)。
serializable(可串行化)
事务A:开启事务并执行 SELECT * FROM testtest, 但并不提交事务
start transaction;
SELECT * FROM testtest;
事务B:开始事务并执行 UPDATE testtest set age = 200 WHERE name = 'zhangsan'
发现事务B停在那里了,没有任何执行,直到事务A提交事务。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
传播行为
1、PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
2、PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作
3、PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。‘
4、PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
5、PROPAGATION_REQUIRES_NEW:支持当前事务,创建新事务,无论当前存不存在事务,都创建新事务。
6、PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
7、PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
扩展:https://www.cnblogs.com/523823-wu/p/8874328.html
————————————————
版权声明:本文为CSDN博主「YoungMingKai」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013083284/article/details/83658304
MYSQL数据库事务4种隔离级别及7种传播行为的更多相关文章
- 数据库事务中的隔离级别和锁+spring Transactional注解
数据库事务中的隔离级别和锁 数据库事务在后端开发中占非常重要的地位,如何确保数据读取的正确性.安全性也是我们需要研究的问题.ACID首先总结一下数据库事务正确执行的四个要素(ACID): 原子性(At ...
- [转]数据库事务中的隔离级别和锁+spring Transactional注解
数据库事务中的隔离级别和锁 数据库事务在后端开发中占非常重要的地位,如何确保数据读取的正确性.安全性也是我们需要研究的问题.ACID首先总结一下数据库事务正确执行的四个要素(ACID): 原子性(At ...
- 数据库事务ACID与隔离级别
如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的 ...
- spring的4种事务特性,5种隔离级别,7种传播行为
spring事务: 事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 事务特性(4种): 原子性 (atomicity):强调事务的不可分割. 一致性 (con ...
- Spring的四种事务特性,五种隔离级别,七种传播行为
Spring事务: 什么是事务: 事务逻辑上的一组对数据对操作,组成这些操作的各个逻辑单元,要么一起成功,要么一起失败. 事务特性(4种): 原子性(atomicity):强调事务的不可分割:一致性( ...
- spring的4种事务特性,4种隔离级别,7种传播行为
spring事务: 什么是事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 事务特性(4种): 原子性 (atomicity):强调事务的不可分割. 一致性 (c ...
- 深入解析Mysql中事务的四大隔离级别及其所解决的读现象
本文详细介绍四种事务隔离级别,并通过举例的方式说明不同的级别能解决什么样的读现象.并且介绍了在关系型数据库中不同的隔离级别的实现原理. 在DBMS中,事务保证了一个操作序列可以全部都执行或者全部都不执 ...
- Spring事务的5种隔离级别和7种传播性
隔离级别 isolation,5 种: ISOLATION_DEFAULT,ISOLATION_READ_UNCOMMITTED,ISOLATION_READ_COMMITTED,ISOLATION_ ...
- MySQL数据库事务的四大特性以及事务的隔离级别
一.事务的四大特性(ACID) 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: 1.原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因 ...
随机推荐
- python基础知识(保留字和标识符、变量、常量、基本数据类型)
保留字 保留字是python语言中已经被赋予特定意义的一些单词,开发程序时,不可以作为变量.函数.类.模块和其他对象的名称来使用例如:import 关键字输入后会变色 通过代码进行查看 import ...
- PJzhang:查看你的微信、QQ、新浪微博都授权给过谁
猫宁!!! 个人信息的保护,需要时刻关注,不能有丝毫懈怠. 保护个人信息,有两个方向,一个是减少个人信息外泄,另一个是上传大量鱼龙杂的个人信息,难以分辨,混淆视听. 这里不谈第二个, ...
- 【VS开发】OutputWnd自动滚动
最近在尝试VS2010中的各种新鲜插件,首先从最简单的输出窗口入手. VS2010向导中产生的输出窗口是通过CMainFrame中的COutputWnd类的对象m_wndOutput生成的.为了向输出 ...
- 【Linux开发】linux设备驱动归纳总结(三):6.poll和sellct
linux设备驱动归纳总结(三):6.poll和sellct xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
- Java十大bug之——包冲突
找bug就像破案,有的bug简单,有的bug复杂,还有的bug隐藏的令人难以发现. 一个逻辑上看起来一切都正常,结果确有问题,且怎么分析都感觉自己写的没问题的情况——包冲突 遇到这个bug最开始没有任 ...
- 【转贴】SQL Server中关于跟踪(Trace)那点事
SQL Server中关于跟踪(Trace)那点事 https://www.cnblogs.com/zhijianliutang/p/4113911.html 作者很牛B.. 前言 一提到跟踪俩字,很 ...
- postman测试webservice接口
- Java中的mutable和immutable对象实例讲解
1.mutable(可变)和immutable(不可变)类型的区别 可变类型的对象:提供了可以改变其内部数据值的操作,其内部的值可以被重新更改. 不可变数据类型:其内部的操作不会改变内部的值,一旦试图 ...
- vue : 无法加载文件 C:\Users\lihongjie\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 htt ps:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。 所在位置 行:1 字符: 1 + vue init webpack vue_p
以管理员方式打开powershell 运行命令:set-ExecutionPolicy RemoteSigned 出现: 执行策略更改执行策略可帮助你防止执行不信任的脚本.更改执行策略可能会产生安全风 ...
- 牛客 2B 树 (组合计数)
传送门 大意: 给定n节点树, 求划分为不超过$k$个连通块的方案数. n,k<=300. 核心观察是每个连通块深度最低的点固定以后染色方案就固定了. 所以答案为$\sum\limits_{i= ...