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