事务的隔离级别
数据库事务的隔离级别有4个,由低到高依次为Read Uncommitted(RU)、Read Committed(RC)、Repeatable Read(RR)、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。
√: 可能出现 ×: 不会出现** | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted | √ | √ | √ |
Read committed | × | √ | √ |
Repeatable read | × | × | √ |
Serializable | × | × | × |
MySQL事务(InnoDB)的默认隔离级别为RR,另外MySQL通过MVCC(多版本并发控制)技术解决了环读的问题。
然后我们来看个简单而Happy的小栗子:
原料
CREATE TABLE `user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of user-- ----------------------------INSERT INTO `user` VALUES ('1', 'wang');INSERT INTO `user` VALUES ('2', 'meng');INSERT INTO `user` VALUES ('3', 'salamander');
操作
Client 1
开启事务后查询数据Client 2
开启事务,改变数据然后在Client 1中再次查询
发现查询数据还是不变
Client 2提交事务
再次在Client 1中查询数据
发现查询数据还是不变,(~。。~)
然后,你可以想象了,为什么这样呢?