事务的隔离级别
数据库事务的隔离级别有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中查询数据
发现查询数据还是不变,(~。。~)
然后,你可以想象了,为什么这样呢?
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。