MySQL综合应用二:事务机制二:四种隔离级别:【READ UNCOMMITTED】、【READ COMMITTED】、【REPEATABLE READ】、【SERIALIZABLE】;

本文主要是介绍MySQL综合应用二:事务机制二:四种隔离级别:【READ UNCOMMITTED】、【READ COMMITTED】、【REPEATABLE READ】、【SERIALIZABLE】;,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.买票的业务场景:适合【READ UNCOMMITTED】的隔离级别

2.银行转账的业务场景:适合使用【READ COMMITTED】这种隔离级别

3.电商订单支付场景:适合使用【REPEATABLE READ】这种隔离级别

4.【SERIALIZABLE】隔离级别


数据库中的事务都是并发执行的,因为事务具有隔离性,会给一些业务带来问题。本篇博客主要介绍【事务并发执行的条件下,怎么去修改事务的隔离级别,以满足业务的要求。】

默认情况下,MySQL是不允许事务之间相互读取临时数据的,但是在某些特殊场合下,我们需要允许事务之间能读取到一些临时数据,这个就必须去修改事务的隔离级别了。

需要根据具体的业务场景,从这四个隔离级别中提挑选合适的一个来使用。

1.买票的业务场景:适合【READ UNCOMMITTED】的隔离级别

业务案例1:A事务看到G8047 1车厢1A坐席是未售出状态,于是A事务就使用UPDATE语句修改了这条记录的状态为已售出,因为A事务还没有提交,所以修改操作只是记录在了redo日志中,真实的数据并没有发生改变。。。。如果,此时B事务启动了,B事务也会看到G8047 1车厢1A坐席是未售出的,于是B事务使用UPDATE修改了这条记录的状态为已售出,然后B事务很快就提交了,于是真实的数据文件就发生了改变。。。。此时,A事务再去提交事务,就发现这个坐席已经是已售出了,于是A事务就引发了回滚操作。

虽然,这个案例中没有产生歧义的数据,但是动不动就购票失败,这种体验很差;;;于是在这种场景中,就应该允许当前的事务去读取其他事务的临时状态,B事务发现A事务的临时数据中已经购买了G8047 1车厢1A坐席的信息,于是B事务就可以去购买其他的坐席了;

对于【买票的业务】这种场景,适合使用“READ UNCOMMITTED”这种隔离级别,意思是:允许事务读取其他事务未提交的临时数据;

其中,“SET SESSION”意思是,设置当前会话的事务隔离级别;这种设置不是全局的,只在当前会话生效;会话的意思是:在Navicat中打开一个SQL面板,编写SQL语句,这个就是一个会话,当把这个面板关了,这个会话就结束了;

演示:

So,如果想让某个事务能够看到其他事务的临时数据,应该怎么做?


2.银行转账的业务场景:适合使用【READ COMMITTED】这种隔离级别

银行转账之类的业务,绝对不能让某个事务去读取其他事务没有提交的临时数据;

比如业务案例2:银行转账类业务,只能让当前事务去读取其他事务提交以后的数据,绝对不能读取其他事务没有提交的临时数据;比如Scott账户原有5000元,A事务开启了同时还没有来得及做任何操作,此时Scott账户有消费行为,B事务将账户余额改成了100块,然后A事务向Scott转账1000元了,如果A事务读取了B事务的临时数据,A事务执行完毕之后,Scott账户余额是4900元。。。如果A事务和B事务都正常COMMIT了,最终的余额是4900元,是没有问题的。。。但是,如果B事务是一笔错误的消费,需要ROLLBACK,但由于允许A事务读取B事务的临时数据,所以最终Scott账户余额是4900元,出错了。。。

对于【银行转账】这种场景,适合使用“READ COMMITTED”这种隔离级别,意思是:当前事务只能读取其他事务已经提交的数据,未提交的临时数据是读取不到的;

演示:


3.电商订单支付场景:适合使用【REPEATABLE READ】这种隔离级别

比如“业务案例3”:比如在京东商城中,顾客下单之后在支出订单之前,卖家给商品涨价啦,顾客应该按照涨价之前的价格支付;;;所以,在这个业务场景中,我们希望当前事务的执行不要受到其他事务的影响,甚至其他事务提交以后的结果也不要影响到当前事务。。。这个事务的隔离级别就是【REPEATABLE READ】,这种隔离级别意味着,当前的事务能读到的数据是事务开始之前的数据,事务开启之后,其他事务提交的数据是读不到的;

这种隔离级别的底层实现:事务执行之前,会把数据copy到undo日志中,一个隔离级别是【REPEATABLE READ】的事务只会去读取undo日志中的属于自己的那部分数据;

电商订单支付场景:适合使用【REPEATABLE READ】这种隔离级别;

案例:

下面需要说明一点:一个事务在执行select操作之后,才能把数据表中的数据copy到undo日志中;;;即下面的事务,如果在【上面的将sal设置为1的事务】提交之前没有select,当【上面的将sal设置为1的事务】提交之后,下面这个事务再第一次执行select的话,其查询的结果就是sal已经被设置为1的t_emp表的数据了;(好吧,undo日志和redo日志的原理需要了解一下。。。。

MySQL数据库默认的事务隔离级别就是【REPEATABLE READ】;即在新的会话中,没有特意通过【SET SESSION TRANSACTION ISOLATION LEVEL ******】去修改事务隔离级别的话,事务的隔离级别就是【REPEATABLE READ】。


4.【SERIALIZABLE】隔离级别

序列化隔离级别:一旦设置了这种隔离级别后,当前会话里的事务,需要等待其他事务执行结束之后,才可以执行,不再会出现并发执行的事务了;虽然序列化执行事务能避免一切业务场景上的问题,但是随之而来的是数据库的并发性能急剧下降;;;;;所以,这种隔离级别是很少使用的;

演示:

可以发现,序列化隔离级别不太好用。。。

这篇关于MySQL综合应用二:事务机制二:四种隔离级别:【READ UNCOMMITTED】、【READ COMMITTED】、【REPEATABLE READ】、【SERIALIZABLE】;的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/347786

相关文章

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优