亲测体验关系型数据库事务的隔离级别

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 亲测体验关系型数据库事务的隔离级别

前言 & mysql默认存储引擎的默认隔离级别

从MySQL 5.x开始, 默认的存储引擎已经由MyISAM换为了InnoDB

MySQL存储引擎详解

查看存储引擎信息:

show engines

微信截图_20230626164831.png查看mysql版本:

select version();

返回值:

version()5.7.28

InnoDB默认的隔离级别是RR(Repeatable read, 可重复读),但还可能存在幻读现象;

依据隔离级别逐级升高,mysql提供了如下四种隔离级别:

a) Read uncommitted(未提交读):最低级别,任何情况都无法保证

b) Read committed(已提交读):可避免脏读的发生 `Orancle等多数数据库的默认级别`

c) Repeateable read(可重复读):可避免脏读、不可重复读的发生`mysql的默认级别`

d) Serializable(可串行化):可避免脏读、不可重复读、幻读的发生

show table status from future where name='our_user'

微信截图_20230626164923.png查看&设置 全局or会话 的事务隔离级别

微信截图_20230626165619.png复现’幻读’

副标题: 以InnoDB存储引擎下默认的隔离级别RR(Repeatable read, 可重复读)为例

mysql 幻读的详解、实例及解决办法

幻读会在 RU / RC / RR 级别下出现,SERIALIZABLE 则杜绝了幻读,但 RU / RC 下还会存在脏读,不可重复读,故我们就以 RR 级别来研究幻读,排除其他干扰。

注意:RR 级别下存在幻读的可能,但也是可以使用对记录手动加 X锁 的方法消除幻读。SERIALIZABLE 正是对所有事务都加 X锁 才杜绝了幻读,但很多场景下我们的业务sql并不会存在幻读的风险。SERIALIZABLE 的一刀切虽然事务绝对安全,但性能会有很多不必要的损失。故可以在 RR 下根据业务需求决定是否加锁,存在幻读风险我们加锁,不存在就不加锁,事务安全与性能兼备,这也是 RR 作为mysql默认隔是个事务离级别的原因,所以需要正确的理解幻读。

mysql默认的隔离级别Repeateable read(可重复读),是无法防止”幻读”现象出现的,复现如下:

微信截图_20230626165652.png

执行事务1:

微信截图_20230626165706.png

此时另起一个窗口,执行(干扰)事务2:

微信截图_20230626165725.png

这时在事务1中,继续执行

微信截图_20230626165820.png报错

即事务1查到没有id=5的记录,同时有一个其他事物(事务2)执行对id=5进行了写入.事务1继续进行insert操作,报主键冲突….事务1就很疑惑:不对啊,我刚才查了,明明没有id=5的记录啊..

解决方案: 给事务1的查询语句加排它锁,这样事务2就无法进行写入


相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
7月前
|
SQL 关系型数据库 MySQL
乐观锁在分布式数据库中如何与事务隔离级别结合使用
乐观锁在分布式数据库中如何与事务隔离级别结合使用
|
5月前
|
SQL 关系型数据库 MySQL
乐观锁在分布式数据库中如何与事务隔离级别结合使用
乐观锁在分布式数据库中如何与事务隔离级别结合使用
|
3月前
|
SQL 存储 Java
数据库———事务及bug的解决
事务的一些概念,并发事务以及并发事务引起的bug,脏读,不可重复读,幻读,数据库中的隔离级别,事务的简单应用
|
5月前
|
数据库
什么是数据库的事务隔离级别,有什么作用
【10月更文挑战第21】什么是数据库的事务隔离级别,有什么作用
57 3
|
5月前
|
存储 关系型数据库 数据挖掘
什么是数据库的事务隔离级别
【10月更文挑战第21】什么是数据库的事务隔离级别
81 1
|
5月前
|
存储 数据库 数据库管理
数据库事务安全性控制如何实现呢
【10月更文挑战第15天】数据库事务安全性控制如何实现呢
|
5月前
|
存储 数据库 数据库管理
什么是数据库事务安全性控制
【10月更文挑战第15天】什么是数据库事务安全性控制
|
5月前
|
供应链 数据库
数据库事务安全性控制有什么应用场景吗
【10月更文挑战第15天】数据库事务安全性控制有什么应用场景吗
|
5月前
|
存储 关系型数据库 MySQL
数据库的事务控制
【10月更文挑战第15天】数据库的事务控制
71 2
|
5月前
|
SQL 关系型数据库 数据库
如何在数据库中实现事务控制呢
【10月更文挑战第15天】如何在数据库中实现事务控制呢
57 1

热门文章

最新文章