一,事务的四大特性
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 作为事务隔离级别的原因,既保证了数据的一致性,又支持较高的 并发度。 **