当前位置: 首页 > news >正文

mysql查线上数据注意数据库的隔离级别

数据库的隔离级别定义了一个事务可能对其他并发事务的可见性,以及它们可能对数据库的影响。隔离级别的选择影响着并发性能和数据的一致性,不同的隔离级别能够防止不同程度的并发问题,如脏读(Dirty Reads)、不可重复读(Nonrepeatable Reads)和幻读(Phantom Reads)。

SQL标准定义了四种隔离级别:

1. 读未提交 (Read Uncommitted)

这是最低的隔离级别,事务可以读取到其他未提交事务的更改。这意味着可能会出现脏读,即一个事务可能读到另一个事务未提交的数据。

例子:

事务A修改了一行数据但还未提交,此时事务B在此隔离级别下可以看到这个修改。

-- 事务A
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;-- 事务B
BEGIN;
SELECT balance FROM accounts WHERE id = 1; -- 可以看到事务A未提交的更改

2. 读提交 (Read Committed)

在这个隔离级别下,一个事务只能读取到其他事务已提交的更改。这避免了脏读,但仍然可能出现不可重复读,即在同一事务中两次相同的查询可能返回不同的结果。

例子:

-- 事务A
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;-- 事务B
BEGIN;
SELECT balance FROM accounts WHERE id = 1; -- 第一次查询
-- 事务A提交更改
SELECT balance FROM accounts WHERE id = 1; -- 第二次查询,可能会看到不同的结果
COMMIT;

3. 可重复读 (Repeatable Read)

在这个隔离级别下,保证在同一事务中多次读取相同的数据会看到相同的结果,即不可重复读现象被防止了。但是,可能会出现幻读,即在同一事务中读取到其他事务新插入的行。

例子:

-- 事务A
BEGIN;
SELECT * FROM accounts WHERE balance > 1000; -- 第一次查询-- 事务B
BEGIN;
INSERT INTO accounts (id, balance) VALUES (3, 2000);
COMMIT;-- 事务A
SELECT * FROM accounts WHERE balance > 1000; -- 第二次查询可能包含了事务B新插入的行
COMMIT;

4. 串行化 (Serializable)

这是最高的隔离级别,它完全隔离了事务,使它们不能并行执行。任何并发的情况都会被阻止,从而避免脏读、不可重复读和幻读。但这也大大降低了并发性能。

例子:

-- 事务A
BEGIN;
SELECT * FROM accounts WHERE balance > 1000; -- 对结果集加锁-- 事务B
BEGIN;
-- 尝试插入新行或更新满足上述SELECT条件的行将会被阻塞,直到事务A提交或回滚
INSERT INTO accounts (id, balance) VALUES (3, 2000); -- 被阻塞

在选择隔离级别时,通常需要在并发性能和数据一致性之间做出权衡。如果可接受一定程度的不一致性以获得更高的并发性能,可以选择较低的隔离级别(如读未提交或读提交)。如果数据一致性非常关键,可能需要选择较高的隔离级别(如可重复读或串行化)。

http://www.lryc.cn/news/416871.html

相关文章:

  • 【专业解析】移动硬盘能识别却打不开:数据恢复实战指南
  • 系统 hap
  • 【Material-UI】按钮与第三方路由库的集成详解
  • Python获取Excel内容
  • python实现小游戏随机猜数
  • YOLOv5与YOLOv8 训练准备工作(不包含环境搭建)
  • 字节跳动发Seed-TTS语音合成模型,可模仿任意人的声音,效果逼真
  • 微信小程序教程011-3:京西购物商城实战之Home页实现
  • 使用 Manim 创建一个二维坐标平面【NumberPlane】
  • Android.mk(TODO)
  • WPF datagrid 选中某一行后让第一列的checkbox选中
  • 洛谷 P1347 排序(福建省历届夏令营)(图论:拓扑排序)
  • Redis 缓存击穿、穿透、雪崩
  • 使用开源RustDesk部署远程控制服务
  • Coco-LIC基于ubuntu的vscode进行断点调试
  • 【Web】从TFCCTF-FUNNY浅析PHPCGI命令行注入漏洞利用
  • 对比一下在 OpenCV 和 AE 中如何实现常用效果 [精]
  • docker安装及使用
  • HTML前端面试基础(一)
  • [Git][多人协作][下]详细讲解
  • MySQL笔记(七):索引
  • JS 原型和原型链
  • 【无标题】图像增强技术:直方图均衡化、拉普拉斯算子、对数变换与伽马变换
  • 自动化专业英语
  • 如何使用 Python 进行数据可视化,比如绘制折线图?
  • PostgreSQL数据库的事务ID和事务机制
  • LeetCode 热题 HOT 100 (020/100)【宇宙最简单版】[创作中]
  • XML动态sql查询当前时间之前的信息报错
  • EMQX服务器安装MQTT测试
  • 3. 无重复字符的最长子串(滑动窗口)