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

事务隔离级别是?

事务隔离级别是数据库管理系统用来控制多个事务并发执行时对数据的可见性和一致性的机制。MySQL支持四种标准的事务隔离级别,它们定义了事务如何与其他并发事务交互。

四种事务隔离级别:
READ UNCOMMITTED(读未提交)
READ COMMITTED(读已提交)
REPEATABLE READ(可重复读)
SERIALIZABLE(可串行化)
MySQL 默认的事务隔离级别:
MySQL的默认隔离级别是 REPEATABLE READ。它确保一个事务在执行期间对数据的读取是可重复的,即使其他事务修改了数据,当前事务的查询结果也不会变化。

事务隔离级别的案例展示:
假设我们有以下的表 account,字段包括 id, name, balance:

CREATE TABLE account (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    balance DECIMAL(10, 2)
);
INSERT INTO account (id, name, balance) VALUES (1, 'Alice', 1000.00), (2, 'Bob', 500.00);
  1. READ UNCOMMITTED(读未提交)
    在此级别,事务可以读取到其他事务尚未提交的修改。这是最弱的隔离级别,容易出现脏读。

示例:

事务A更新了数据,但还没有提交。
事务B读取到了事务A未提交的数据。
SQL代码:

-- 设置隔离级别为 READ UNCOMMITTED
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

-- 事务A
BEGIN;
UPDATE account SET balance = balance - 100 WHERE id = 1;

-- 事务B
BEGIN;
SELECT * FROM account;  -- 可能读取到事务A的未提交数据

  1. READ COMMITTED(读已提交)
    在此级别,事务只能读取到已提交的事务修改的数据。也可以避免脏读,但仍然可能会遇到不可重复读的问题。

示例:

事务A和事务B分别对同一数据进行读取和修改,事务A读取的值可能会在事务B提交后发生变化。
SQL代码:
– 设置隔离级别为 READ COMMITTED
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

– 事务A

BEGIN;
SELECT balance FROM account WHERE id = 1;  -- 读取 Alice 的余额

-- 事务B
BEGIN;
UPDATE account SET balance = balance - 50 WHERE id = 1;  -- 修改 Alice 的余额
COMMIT;

-- 事务A
SELECT balance FROM account WHERE id = 1;  -- 可能会得到不同的余额,因为事务B已提交
  1. REPEATABLE READ(可重复读)
    这是MySQL的默认隔离级别。它保证一个事务在执行期间对同一数据的多次读取结果是一样的,即使其他事务修改了数据。它能防止脏读和不可重复读,但可能会出现幻读。

示例:

事务A读取某个范围内的数据,事务B在此范围内插入了新数据。
事务A在后续读取时,可能会看到不同的记录(幻读)。
SQL代码:

-- 设置隔离级别为 REPEATABLE READ
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- 事务A
BEGIN;
SELECT * FROM account WHERE balance > 300;  -- 读取余额大于300的账户

-- 事务B
BEGIN;
INSERT INTO account (id, name, balance) VALUES (3, 'Charlie', 400.00);
COMMIT;

-- 事务A
SELECT * FROM account WHERE balance > 300;  -- 可能会看到事务B插入的新记录,发生幻读
  1. SERIALIZABLE(可串行化)
    这是最高的隔离级别。它通过强制事务之间按顺序执行,避免了脏读、不可重复读和幻读。事务的执行就像是串行执行一样。

示例:

在此级别下,事务A和事务B必须按顺序执行,事务B在事务A完成之前不能执行。
SQL代码:

-- 设置隔离级别为 SERIALIZABLE
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

-- 事务A
BEGIN;
SELECT * FROM account WHERE balance > 300;

-- 事务B
BEGIN;
-- 事务B将被阻塞,直到事务A提交或回滚
INSERT INTO account (id, name, balance) VALUES (3, 'Charlie', 400.00);
COMMIT;

READ UNCOMMITTED:允许脏读,事务间没有隔离。 READ COMMITTED:避免脏读,但可能发生不可重复读。
REPEATABLE READ:避免脏读和不可重复读,但可能发生幻读(MySQL默认)。
SERIALIZABLE:最强的隔离级别,事务串行执行,避免所有并发问题。

相关文章:

  • 04 泛型编程
  • AMBA-CHI协议详解(二十四)
  • window.btoa 和 atob 记不住,怎么根据字母意思去理解
  • 错误: 缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序
  • 当底层硬盘老旧时,如何限制Linux服务器和Windows服务的IOPS?
  • 苍穹外卖-Spring Task使用的前置条件
  • GROOT N1,英伟达开源的人形机器人模型
  • 【LLMs篇】06:Encoder-Only vs Decoder-Only vs Encoder-Decoder
  • OWASP Top 10 解读:如何构建更安全的应用?
  • 【C++】二叉树和堆的链式结构
  • 阿里云 AI 搜索产品荣获 Elastic Innovation Award 2024
  • MySQL 调优
  • 线性规划的标准形式
  • openpnp - 如果安装面的钣金接触面不平,可以尝试加垫片
  • Springboot List集合的校验方式
  • 替代Qt中信号与槽的完整例子。
  • CVPR2025 | TAPT:用于视觉语言模型鲁棒推理的测试时对抗提示调整
  • 如何实现一个DNS
  • Java Web应用程序实现用户登录、学生信息管理和验证码验证以及页面跳转等基本功能(IDEA)含(Ajax、JSTL)
  • 【时时三省】(C语言基础)用gutchar函数输入一个字符
  • 天启年间故宫“三殿”重修与晚明财政
  • 韩代总统李周浩履职
  • 城市更新·简报│中央财政支持城市更新,倾斜超大特大城市
  • 中国科学院院士张泽民已任重庆医科大学校长
  • 许峰已任江苏省南京市副市长
  • 新华保险一季度净赚58.82亿增19%,保费收入增28%