然之

数据库事务的隔离级别相关概念

让人想犯罪 __ 提交于 2019-11-26 09:37:52
摘要 本文主要是重新理一下几个概念。经常发生一个对幻读错误的理解,比如场景:事务A 查询得到100条记录,事务B插入一条数据,事务B查询得到101条数据。很多人以为这是幻读场景,实际上不对,这属于不可重复读。MVCC机制就能解决这个问题。详见 Mysql中MVCC的使用及原理详解 这篇博客的示例。 幻读场景(假设id建立了唯一索引):比如 事务A查询id=1的数据,如果不存在,则插入id=1的这一行记录,在查询之后插入之前,事务B插入了id=1的记录,这时候事务A是查不到的,但是A是不能再插入id=1的数据行。 事务的ACID特性 原子性(A) 指处于同一个事务中的多条语句是不可分割的。要么就一起提交,要么就一起回滚,不存在部分提交,部分回滚。 一致性(C) 事务必须使数据库从一个一致性状态变换到另外一个一致性状态。比如转账,转账前两个账户余额之和为2k,转账之后也应该是2K。 隔离性(I) 指多线程环境下,一个线程中的事务不能被其他线程中的事务打扰 持久性(D) 事务一旦提交,就应该被永久保存起来。 事务的隔离级别概念 RU(Read uncommitted 未提交读) 事务A能读取到事务B中未提交的数据。 存在脏读,不可重复读,幻读的问题。 RC(Read committed 已提交读) 事务A能读取到事务B中已提交的数据。 解决脏读的问题,存在不可重复读,幻读的问题。 RR