讲事务到底是隔离的还是不隔离的
这个要看隔离级别;
对于可重复读,查询只承认在事务启动前就已经提交完成的数据;
对于读提交,查询只承认在语句启动前就已经提交完成的数据;
作者提问:现在,我要把所有“字段c和id值相等的行”的c值清零,但是却发现了一个“诡异”的、改不掉的情况。请你构造出这种情况,并说明其原理。
mysql> CREATE TABLE `t` (
`id` int(11) NOT NULL,
`c` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
insert into t(id, c) values(1,1),(2,2),(3,3),(4,4);
复现出来以后,请你再思考一下,在实际的业务开发中有没有可能碰到这种情况?你的应用代码会不会掉进这个“坑”里,你又是怎么解决的呢?
开启另外一个事务,在update语句执行之前,修改c的值,比如
update t set c = id + 1;然后提交;这时候再回到这个事务,去执行
update t set c = 0 where c = id; 发现修改不了数据。
解决方法:提交当前事务,重新对其进行修改。