【SQL】ACID事务与隔离级别

数据库事务

数据库事务具有ACID这4个特性:

  • A:Atomicity,原子性,将所有SQL作为原子工作单元执行,要么全部执行,要么全部不执行;
  • C:Consistency,一致性,事务完成后,所有数据的状态都是一致的,即A账户只要减去了100,B账户则必定加上了100;
  • I:Isolation,隔离性,如果有多个事务并发执行,每个事务作出的修改必须与其他事务隔离;
  • D:Durability,持久性,即事务完成后,对数据库数据的修改被持久化存储。

事务分为隐式事务和显式事务

  • 隐式事务
    对于单条SQL语句,数据库系统自动将其作为一个事务执行,这种事务被称为隐式事务。
  • 显式事务
    手动把多条SQL语句作为一个事务执行,使用BEGIN开启一个事务,使用COMMIT提交一个事务,这种事务被称为显式事务
    BEGIN;
    UPDATE accounts SET balance = balance - 100 WHERE id = 1;
    UPDATE accounts SET balance = balance + 100 WHERE id = 2;
    COMMIT;/ROLLBACK; -- ROLLBACK可以使事务失败
    

隔离级别

分别对应可能出现的数据不一致的情况:

Isolation Level(隔离级别) 脏读(Dirty Read) 不可重复读(Non Repeatable Read) 幻读(Phantom Read)
Read Uncommitted(读未提交) Yes Yes Yes
Read Committed (读已提交) - Yes Yes
Repeatable Read (可重复读) - - Yes
Serializable (串行化) - - -

接下来依次介绍4种隔离级别的数据一致性问题:

Read Uncommitted(读未提交)

  • 描述:这是最低的隔离级别,在该级别下,一个事务可以读取另一个事务未提交的数据。
  • 数据一致性问题:
    • 脏读(Dirty Reads):一个事务可能读取另一个事务未提交的更改。如果这些更改最终被回滚,则读取的数据是无效的。
    • 不可重复读(Non-Repeatable Reads):在同一事务中,同一查询可能返回不同结果,因为其他事务正在更改数据。
    • 幻读(Phantom Reads):在同一事务中执行相同的查询,由于其他事务添加或删除了符合查询条件的行,所返回的结果集可能会不同。

Read Committed(读已提交)

  • 描述:这个级别允许在一个事务内执行的查询只看到已经提交的更改。
  • 数据一致性问题:
    • 不可重复读:同一个事务内两次执行相同的查询可能会得到不同的结果,因为其他事务可能在两次查询之间提交了更新。
    • 幻读:可能会出现,因为其他事务插入或删除了符合查询条件的行。

Repeatable Read(可重复读)

  • 描述:保证在同一事务内的查询可以多次执行并返回相同的结果,即使其他事务在此期间提交了更新。
  • 数据一致性问题:
    • 幻读:尽管同一事务中的同一查询会返回一致的结果集,但如果其他事务添加或删除了符合查询条件的行,还是可能出现幻读问题。这是因为新插入的行(“幻影行”)可能被包含在后续的查询结果中。

Serializable(串行化)

  • 描述:这是最高的隔离级别。它通过强制事务串行执行来避免幻读,确保一个事务完全执行完毕后,另一个事务才能开始执行。
  • 数据一致性问题:
    • 在串行化隔离级别下,理论上不会遇到脏读、不可重复读或幻读这类的数据一致性问题。这是因为事务是顺序执行的,每个事务都是在前一个事务完成后才开始,从而避免了数据在不同事务间的不一致性。

相关推荐

  1. 事务并发问题 事务隔离级别

    2024-05-02 13:28:04       34 阅读
  2. 【SQL】ACID事务隔离级别

    2024-05-02 13:28:04       25 阅读
  3. 事务隔离级别

    2024-05-02 13:28:04       48 阅读
  4. 数据库事务隔离级别

    2024-05-02 13:28:04       47 阅读
  5. 事务隔离级别

    2024-05-02 13:28:04       33 阅读
  6. spring 事务隔离级别

    2024-05-02 13:28:04       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-02 13:28:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-02 13:28:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-02 13:28:04       82 阅读
  4. Python语言-面向对象

    2024-05-02 13:28:04       91 阅读

热门阅读

  1. python 学习: 矩阵运算

    2024-05-02 13:28:04       32 阅读
  2. Android 修改Camera的最大变焦倍数

    2024-05-02 13:28:04       31 阅读
  3. 三生随记——午夜医院的诡异回声

    2024-05-02 13:28:04       26 阅读
  4. 美国国防部数据网格参考架构概述(下)

    2024-05-02 13:28:04       31 阅读
  5. 文件上传知识

    2024-05-02 13:28:04       29 阅读
  6. k8s面试29连问

    2024-05-02 13:28:04       25 阅读
  7. solidity(16)

    2024-05-02 13:28:04       34 阅读
  8. 【刷爆力扣之二叉树】107. 二叉树的层序遍历 II

    2024-05-02 13:28:04       35 阅读
  9. LeetCode //C - 44. Wildcard Matching

    2024-05-02 13:28:04       35 阅读