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

云掣YunChe5个月前技术文章316

数据库的隔离级别定义了一个事务可能对其他并发事务的可见性,以及它们可能对数据库的影响。隔离级别的选择影响着并发性能和数据的一致性,不同的隔离级别能够防止不同程度的并发问题,如脏读(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); -- 被阻塞

 

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


相关文章

minio存储桶命名规则

存储桶命名规则创建S3存储桶后,无法更改存储桶名称,因此请明智地选择名称。重要在2018年3月1日,我们更新了美国东部(弗吉尼亚北部)地区S3存储桶的命名约定,以匹配我们在所有其他全球AWS区域中使用...

MySQL数据库复制延迟

【问题处理记录】1.查看资源情况,通过查找慢 SQL 发现,从 3:00 开始,存在较多 update 和 delete 操作。怀疑是表结构无主键,由于 RDS 日志模式默认采取的 row 模式,导致...

scylladb简单命令介绍

一、cql 命令查看版本SHOW VERSION查看连接的数据库地址SHOW HOST批量执行.cql文件中的命令SOURCE '/home/thobbs/commands.cql'开启和关闭命令追踪...

从 InnoDB 到 Memory:MySQL 存储引擎的多样性

事务存储引擎是数据库管理系统中负责数据存储、检索和事务处理的组件。它们支持事务的四个基本特性,通常被称为 ACID 属性:原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成,不...

MySQL 自动化部署 5.6版本

MySQL 自动化部署 5.6版本

一、脚本环境说明系统:CentOS 7MySQL:该脚本只支持安装 MySQL 5.6 GA 版本如有问题可以联系:文若 wenruo@dtstack.com脚本默认安装路径 /usr/local/m...

PostgreSQL 逻辑备份详解

前言当谈到关系型数据库的备份和恢复时,逻辑备份是一种备份方法,它备份数据库的逻辑结构和数据,而不是直接备份磁盘上的物理数据。这样做有许多好处,比如备份速度更快,可以选择性地备份数据库中的某些数据,以及...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。