ACID、事务隔离、脏读、可重复读、幻读
ACID的概念:
原子性(atomicity):一个事务中的操作,要么全部完成,要么全部不完成,若过程中发生错误,则恢复到事务开始之前的那个状态。
一致性(consistency):事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态。不一致的例子:事务执行了一半,只有一部分的数据写入了数据库,然后发生故障,导致数据不一致。
隔离性(isolation):允许多个事务同时操作,但防止事务交叉执行导致数据的不一致。包括未提交读、已提交读、可重复读、串行化。
持久性(durability):事务结束之后,数据的储存就是永久的,不会丢失。
事务的隔离级别:
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
read uncommitted(未提交读) | 是 | 是 | 是 |
read committed(已提交读) | 否 | 是 | 是 |
repeatable read(可重复读) | 否 | 否 | 是 |
serializable(串行化) | 否 | 否 | 否 |
并发事务存在的问题:
更新丢失:多个事务选择同一行数据,最后提交的事务覆盖了前面提交的事务数据,造成更新丢失
脏读:事务A读取到了事务B已修改,但未提交的数据。事务B回滚则数据不一致(不满足事务的一致性)
不可重复读:事务A读取一次数据后,事务B修改了这些数据,事务A再次读取这些数据时,发现数据不一致(不满足事务的隔离性)
幻读:事务A读取到了事务B提交后新增的数据(不满足事务的隔离性)
脏读、不可重复读、幻读的区别:
脏读:事务B还未提交的数据就被事务A读到了
不可重复读:事务B修改数据并提交,被事务A读到了
幻读:事务B新增、删除数据并提交,被事务A读到了