事务的特性:

原子性:事务的不可分割,组成事务的各个逻辑单元不可分割。

一致性:事务执行的前后,数据完整性保持一致。

隔离性:事务执行不应该受到其他事务的干扰。

持久性:事务一旦结束,数据就持久化到数据库中。

查看/设置隔离级别

查看: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种传播行为的更多相关文章

  1. 数据库事务中的隔离级别和锁+spring Transactional注解

    数据库事务中的隔离级别和锁 数据库事务在后端开发中占非常重要的地位,如何确保数据读取的正确性.安全性也是我们需要研究的问题.ACID首先总结一下数据库事务正确执行的四个要素(ACID): 原子性(At ...

  2. [转]数据库事务中的隔离级别和锁+spring Transactional注解

    数据库事务中的隔离级别和锁 数据库事务在后端开发中占非常重要的地位,如何确保数据读取的正确性.安全性也是我们需要研究的问题.ACID首先总结一下数据库事务正确执行的四个要素(ACID): 原子性(At ...

  3. 数据库事务ACID与隔离级别

    如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的 ...

  4. spring的4种事务特性,5种隔离级别,7种传播行为

    spring事务:  事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 事务特性(4种): 原子性 (atomicity):强调事务的不可分割. 一致性 (con ...

  5. Spring的四种事务特性,五种隔离级别,七种传播行为

    Spring事务: 什么是事务: 事务逻辑上的一组对数据对操作,组成这些操作的各个逻辑单元,要么一起成功,要么一起失败. 事务特性(4种): 原子性(atomicity):强调事务的不可分割:一致性( ...

  6. spring的4种事务特性,4种隔离级别,7种传播行为

    spring事务: 什么是事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 事务特性(4种): 原子性 (atomicity):强调事务的不可分割. 一致性 (c ...

  7. 深入解析Mysql中事务的四大隔离级别及其所解决的读现象

    本文详细介绍四种事务隔离级别,并通过举例的方式说明不同的级别能解决什么样的读现象.并且介绍了在关系型数据库中不同的隔离级别的实现原理. 在DBMS中,事务保证了一个操作序列可以全部都执行或者全部都不执 ...

  8. Spring事务的5种隔离级别和7种传播性

    隔离级别 isolation,5 种: ISOLATION_DEFAULT,ISOLATION_READ_UNCOMMITTED,ISOLATION_READ_COMMITTED,ISOLATION_ ...

  9. MySQL数据库事务的四大特性以及事务的隔离级别

    一.事务的四大特性(ACID) 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: 1.原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因 ...

随机推荐

  1. javascrit-function中this的指向问题

    javascrit中this的指向 全局作用域或者普通函数中 this 指向全局对象 window. //直接打印 console.log(this) //window //function声明函数 ...

  2. (5.1)mysql高可用系列——高可用架构方案概述

    关键词:mysql高可用概述,mysql高可用架构 常用高可用方案 20190918 现在业内常用的MySQL高可用方案有哪些?目前来说,用的比较多的开源方案分内置高可用与外部实现,内置高可用有如下: ...

  3. SpringDataRedis配置

    1.父pom.xml配置依赖包 <dependencyManagement> <dependencies> <dependency> <groupId> ...

  4. Hive怎么使用远程连接

    HIVE的连接模式== 本地连接模式 直接启动hive命令 HIVE的远程连接 这里要启动HIVE的服务 thirft进行编写 hiveserver2 —- > 前台启动 后台启动 前台启动 h ...

  5. MyBatis清空数据库表数据

    <update id="truncateTable"> truncate table ${tableName} </update> <update i ...

  6. 如何实现一个简化版的 jQuery

    对于操作 DOM 来说,jQuery 是非常方便的一个库,虽然如今随着 React, Vue 之类框架的流行,jQuery 用得越来越少了,但是其中很多思想还是非常值得我们学习的,这篇文章将介绍如何从 ...

  7. CSS3点击波浪按钮特效

    在线演示 本地下载

  8. DataX操作指南

    1.DataX介绍 DataX DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.SqlServer.Postgre.HDFS.Hive.ADS.HB ...

  9. C#中static修饰符的作用

    static在C#中表示的是静态的,比如一个静态的字段是归类型所有,而非归对象所有,也就是说,在调用这个字段时,只能用类型去调,而不能用对象. 实例字段时随着对象创建而创建,对象销毁而销毁,而静态字段 ...

  10. Scala新版本学习(2):

    1.本章要点; (1)if表达式有值: (2)块也有值,是它最后一个表达式的值 (3)Scala的for循环就像是"增强版的"Java for循环 (4)分号不是必须的 (5)vo ...