RDBMS 事务 的4个特性,ACID。
A-原子性,一个事务的操作要么全部成功,要么全部失败。
C-一致性,如A转账给B,A的账户钱-了,B的账户需要+,要一致。
I-隔离性,并发的事务时相互隔离的,每个事务有自己私有的数据空间。
D-持久性,一旦事务提交,那么它对数据库中的对应数据的状态的变更就会永久保存到数据库中。即使发生系统崩溃或机器宕机等故障,只要数据库能够重新启动,那么一定能够将其恢复到事务成功结束的状态。
在串型执行的条件下,数据修改的顺序是固定的、可预期的结果,ACID还好保证。
并发执行的情况下,数据的修改是不可预期的,也不固定,为了实现数据修改在并发执行的情况下得到一个固定、可预期的结果,由此产生了隔离级别。
不同的隔离级别是在数据可靠性和并发性之间的均衡取舍,隔离级别越高,对应的并发性能越差,数据越安全可靠。
隔离级别
READ UNCOMMITTED 事务之间可以读取彼此未提交的数据。
READ COMMITTED 顾名思义,事务之间可以读取彼此已提交的数据。不过如果A修改后B读取数据的过程中,A再次修改数据后B再次读取数据,两次得到的数据可能不一样。
REPEATABLE READ 一次事务中只在第一次select时生成版本,后续的查询都是在这个版本上进行,从而实现了可重复读。事务A依次执行如下3条sql,事务B在语句1和2之间,插入10条age=20的记录,事务A就幻读了。
SERIALISABLE
该级别下,会自动将所有普通select转化为select ... lock in share mode执行,即针对同一数据的所有读写都变成互斥的了,可靠性大大提高,并发性大大降低。
MVCC(Multiple Version Concurrency Control)
多版本并发控制可以简单地理解为SVN的版本控制。
读异常
脏读:读取了脏数据(不存在的数据)。 事务A读 事务B写(未提交) 事务A读(脏数据) 事务B回滚
不可重复读:既可以读取修改的数据,也可以读取新增的数据(幻读)。 事务A读 事务B写(更新已提交) 事务A读(数据不一致,不可重复读)
幻读:仅可以读取新增的数据,但是无法读取修改的数据; 事务A读 事务B写(新增已提交) 事务A读(数据不一致,幻读)