数据库事务

数据库事务具有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可以使事务失败
    

隔离级别

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

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

Read Uncommitted(读未提交)

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

Read Committed(读已提交)

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

Repeatable Read(可重复读)

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

Serializable(串行化)

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