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

原文地址:https://www.cnblogs.com/eryun/p/12051958.html

时间: 2024-07-31 12:45:19

MYSQL数据库事务4种隔离级别及7种传播行为的相关文章

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

数据库事务中的隔离级别和锁 数据库事务在后端开发中占非常重要的地位,如何确保数据读取的正确性.安全性也是我们需要研究的问题. ACID 首先总结一下数据库事务正确执行的四个要素(ACID): 原子性(Atomicity):即事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做,不能只做一部分:一致性(Consistency):在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是处于正确的状态,即数据完整性约束没有被破坏:比如我们做银行转账的相关业务,A转账给B,要求

事务的四种隔离级别和七种传播行为

很多人容易搞混不可重复读和幻读,确实这两者有些相似.但不可重复读重点在于update和delete,而幻读的重点在于insert. 避免不可重复读需要锁行就行 避免幻影读则需要锁表 如果使用锁机制来实现这两种隔离级别,在可重复读中,该sql第一次读取到数据后,就将这些数据加锁,其它事务无法修改这些数据,就可以实现可重复 读了.但这种方法却无法锁住insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会 发现莫名其妙多了一条之前没有的数

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

spring事务: 什么是事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 事务特性(4种): 原子性 (atomicity):强调事务的不可分割. 一致性 (consistency):事务的执行的前后数据的完整性保持一致. 隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰 持久性(durability) :事务一旦结束,数据就持久到数据库 如果不考虑隔离性引发安全性问题: 脏读 :一个事务读到了另一个事务的未提交的数据 不可重

数据库事务特性和隔离级别

事务 一组业务操作,要么全部成功,要么全部不成功. ----------------事务的特性-------------- 原子性:一个事务是一个整体,不可分割,事务中的操作要么都成功,要么都失败. 一致性:事务必须是使数据库从一个一致性状态变到另一个一致性状态.事务执行前后,数据库的状态是一致的. 例如:A有1000,元,B有1000元,加起来是2000,中间执行转账的操作,转账后两个人的钱加起来还是2000. 隔离性:两个或多个事务并发操作,之间会互相影响.数据库提供了隔离级别来消除这些影响

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

本文详细介绍四种事务隔离级别,并通过举例的方式说明不同的级别能解决什么样的读现象.并且介绍了在关系型数据库中不同的隔离级别的实现原理. 在DBMS中,事务保证了一个操作序列可以全部都执行或者全部都不执行(原子性),从一个状态转变到另外一个状态(一致性).由于事务满足久性.所以一旦事务被提交之后,数据就能够被持久化下来,又因为事务是满足隔离性的,所以,当多个事务同时处理同一个数据的时候,多个事务直接是互不影响的,所以,在多个事务并发操作的过程中,如果控制不好隔离级别,就有可能产生脏读.不可重复读.

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

隔离级别 isolation,5 种: ISOLATION_DEFAULT,ISOLATION_READ_UNCOMMITTED,ISOLATION_READ_COMMITTED,ISOLATION_REPEATABLE_READ,ISOLATION_SERIALIZABLE, 隔离级别解决的问题: 脏读, 幻读, 不可重复读, 传播性 propagation,7 种: PROPAGATION_REQUIRED,PROPAGATION_SUPPORTS,PROPAGATION_MANDATORY

mysql 事务的四种隔离级别

MYSQL标准定义了4种隔离级别,用来限定事务内外的哪些改变是可见的,哪些是不可见的. 低的隔离级一般支持更高的并发处理,并拥有更低的系统开销. 隔离级别由低到高:Read Uncommitted < Read Committed < Repeatable Read < Serializable. 第一:READ UNCOMMITTED (读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交(commit)事务的执行结果. 本隔离级别很少用于实际应用,因为它的性能也不比其他级别好

MySQL数据库事务隔离级别(Transaction Isolation Level)

今天在学习JDBC的时候看到了关于MySql的事务的隔离级别的问题,感觉内容挺高级的,所以记录一篇文章,以备后面使用. 数据库隔离级别有四种,应用<高性能mysql>一书中的说明: 然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 1 #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE. 2 [mysqld] 3 transaction-isolation = R

网上资料笔记总结!!数据库事务并发问题,锁机制和对应的4种隔离级别

数据库事务并发问题 数据库的操作通常为写和读,就是所说的CRUD:增加(Create).读取(Read).更新(Update)和删除(Delete).事务就是一件完整要做的事情.事务是恢复和并发控制的基本单位.事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少.事务在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序.是数据库中各种数据项的一个程序执行单元.事务是用户定义的一个操作序列(多个表同时读写).这些操作要么都做,要么都不做,是一个不可分割的工作单位