最近回过头来,发现以前的一些基础性的东西记忆不是很深了,在此重新梳理下。同时这里只是简单的记录,并没有深入的分析,因为任何一个东西都够一长篇文章的。后期有时间了可以重新写下。
数据库的事务四大特性,还有传说中的脏读、不可重复读、幻读
ACID,这个网上有很多资料不一一细说。比如这一篇就很不错。
事务的四大特性是如何保证的呢?
原子性通过undolog保证
一致性通过redolog保证
持久性通过redolog保证
隔离性通过锁机制保证
再说下自己对脏读、不可重复读、幻读的理解。
这里的理解都是以A事务为主事务,B事务为干扰事务来说明。
- 脏读:A事务开启了事务,进行查询,这时候B事务也开启事务,进行了更新操作,但是未提交。A事务重新查了一次可以查到。总之:A事务读到了B事务未提交的数据。
- 不可重复读:A事务读一条或者多条记录,B事务修改了这些记录,同时提交。A事务再次查看数据不同了。总之,A事务读到了B事务提交的更新记录。
- 幻读:A事务读某个表的数据,比如大于1的有2条,但是呢B事务提交了一条记录,值为3。A再次读取多出来一条记录了。总之:A事务读到了B事务提交的插入删除记录。
数据库的隔离级别
- Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
- Repeatable read (可重复读):可避免脏读、不可重复读的发生。
- Read committed (读已提交):可避免脏读的发生。
- Read uncommitted (读未提交):最低级别,任何情况都无法保证。
mysql的事务隔离级别
环境:mysql 5.7.24,引擎:innodb
这里主要测试了rr和rc以及ru三种。
rr下测试结果是:除了不会发生脏读、不可重复读以为。也不会发生幻读。具体原因下面分析。
rc下的结果:幻读出现、不可重复读出现。脏读未出现。
ru下的结果:都出现
所以mysql数据库下的rr类比于序列化。这里用了‘类比于’是因为rr下的读是基于mvcc(多版本并发控制机制),也就是一致性读。并不是真正的序列化,且要在rr隔离级别,同事innodb引擎下。而mvcc的实现是基于undolog的。可以查看这里了解MVCC。如果想进一步去了解可以多看看网上的一些资料。
网友评论