事务的隔离级别

126 阅读2分钟

一,事务的四大特性

1,原子性 Atomicity

要么都是成功,要么都是失败,不可能出现部分成功或者部分失 败的情况。 InnoDB 里面是通过 undo log 来实现的,它记录了数据修改之前的值(逻 辑日志),一旦发生异常,就可以用 undo log 来实现回滚操作。

2,一致性 consistent

比如 转账,A账户少了1000块,B账户必须增加1000块才可以。

3,隔离性 Isolation

多个事务,对表或者行的并发操作,应该是透 明的,互相不干扰的。

4,持久性,Durable

我们对数据库的增删改操作,只要事务提交成功,那么结果就是永久性的,不可能因为我们系统 机或者重启了数据库的服务器,它又恢复到原来的状态了。这个就是事务的持久性。

持久性是通过 redo log 和 double write 双写缓冲来实现的,我们操作数据的时候, 会先写到内存的 buffer pool 里面,同时记录 redo log,如果在刷盘之前出现异常,在 重启后就可以读取 redo log 的内容,写入到磁盘,保证数据的持久性。 当然,恢复成功的前提是数据页本身没有被破坏,是完整的,这个通过双写缓冲 (double write)保证。

** 原子性,隔离性,持久性,最后都是为了实现一致性。**

二,事务并发的三大问题都是数据库的 读一致性 的问题。

1,脏读 2,不可重复读 3,幻读 可能觉得删除也属于不可重复读,但是有人明文规定,没办法,, 下面是 SQL92 标准,网站已打不开了。。

三,事务隔离级别

  • SQL92 的标准 但是不同的数据库厂商或者存储引擎的实现有一定的差异, 比如 Oracle 里面就只有两种 RC(已提交读)【默认】和 Serializable(串行化)。 那么 InnoDB 的实现又是怎么样的呢?

** InnoDB 支持的四个隔离级别和 SQL92 定义的基本一致,隔离级别越高,事务的并 发度就越低。唯一的区别就在于,InnoDB 在 RR 的级别就解决了幻读的问题。这个也是 InnoDB 默认使用 RR 作为事务隔离级别的原因,既保证了数据的一致性,又支持较高的 并发度。 **