mysql传播行为,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

标签:200,事务,隔离,testtest,数据库,提交,MYSQL,执行,SELECT

来源: https://www.cnblogs.com/eryun/p/12051958.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程简介: 课程总计41课时,从什么是事务讲起,直到分布式事务解决方案,很的0基础基础与提升系列课程。对于难以理解的知识点,全部用画图+实战的方式讲解。 第一部分:彻底明白事务的四个特性:原子性、一致性、隔离性、持久性,用场景和事例来讲解。 第二部分:实战讲数据库事务的6中并发异常:回滚丢失、覆盖丢失、脏读、幻读、不可重复读、MVCC精讲。 第三部分:彻底搞清楚4事务隔离级别:READ_UNCOMMITTED 读未提交隔离级别、READ_COMMITTED 读已提交隔离级别、REPEATABLE_READ 可重复度隔离级别、SERIALIZABLE 序列化隔离级别 第四部分:彻底搞清楚MySQL的各锁:行锁、表锁、共享锁、排它锁、Next-Key锁、间隙锁、X锁、S锁、IS锁、IX锁、死锁、索引与锁、意向锁等。 第五部分:彻底搞清楚Spring事务的7传播级别的原理和使用:PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER、PROPAGATION_NESTED分布式事务的理论基础:RPC定理、BASE理论、XA协议都是什么,原理是什么,有什么关联关系 第六部分:分布式事务的5解决方案原理和优缺点:2PC两阶段提交法、3PC三阶段提交法、TCC事务补偿、异步确保策略、最大努力通知策略 第七部分:阿里巴巴分布式事务框架Seata:历经多年双十一,微服务分布式事务框架,用一个Nacos+Spring Cloud+Seta+MySql的微服务项目,实战讲解阿里的分布式事务技术,深入理解和学习Seata的AT模式、TCC模式、SAGA模式。 课程资料: 课程附带配套2个项目源码72页高清PDF课件一份阿里巴巴seata-1.1.0源码一份阿里巴巴seata-server安装包一份

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值