这里有新鲜出炉的 Mysql 教程,程序狗速度看过来!
MySQL 是一个开放源码的小型关联式数据库管理系统,开发者为瑞典 MySQL AB 公司。MySQL 被广泛地应用在 Internet 上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了 MySQL 作为网站数据库。
这篇文章主要介绍了 MySQL 数据库事务隔离级别详解的相关资料, 需要的朋友可以参考下
数据库事务隔离级别
数据库事务的隔离级别有 4 个,由低到高依次为
这四个级别可以逐个解决脏读 、不可重复读 、幻读 这几类问题。
√: 可能出现 ×: 不会出现
事务级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted | √ | √ | √ |
Read committed | × | √ | √ |
Repeatable read | × | × | √ |
Serializable | × | × | × |
注意:我们讨论隔离级别的场景,主要是在多个事务并发的情况下。
脏读、幻读、不可重复读
脏读:
脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
不可重复读:
是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。(即不能读到相同的数据内容)
幻读:
是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
example:
表:
- CREATE TABLE `cc_wsyw126_user_test_isolation_copy` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `password` varchar(64) NOT NULL,
- `age` int(11) NOT NULL,
- PRIMARY KEY (`id`),
- KEY `ix_age` (`age`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
模拟数据:
- INSERT INTO `cc_wsyw126_user_test_isolation_copy` (`password`, `age`)
- VALUES
- ('1', 1),
- ('2', 2),
- ('3', 3),
- ('4', 4);
第一个事务 A:
- start transaction
- insert into cc_wsyw126_user_test_isolation_copy (password, age) values ('5',5)
- commit
第二个事务 B:
- start transaction
- update cc_wsyw126_user_test_isolation_copy set age = 2 where password >='2'
- select * from cc_wsyw126_user_test_isolation_copy where password >= '2';
- commit
重现步骤:
只要 A 事务的 insert 语句,在 B 事务 select 之前和 update 之后即可。
MySQL InnoDB 存储引擎,实现的是基于多版本的并发控制协议——MVCC (Multi-Version Concurrency Control) 加上间隙锁(next-key locking)策略在 Repeatable Read (RR) 隔离级别下不存在幻读。如果测试幻读,在 MyISAM 下实验。
在聚集索引(主键索引)中,如果有唯一性约束,InnoDB 会将默认的 next-key lock 降级为 record lock。
来源: http://www.phperz.com/article/17/0812/339409.html