可重复读引起的问题一则

这是群友公司的一个问题
模拟环境如下
  1. drop table if exists t1;  
  2. drop table if exists t2;  
  3. create table t1 (  
  4.     id int not null primary key ,  
  5.     batchid int ,  
  6.     state int   
  7. );  
  8.   
  9. create table t2(  
  10.     batchid int not null primary key,  
  11.     state int  
  12. );  
  13.   
  14. insert into t1 values(1,1,0);  
  15. insert into t1 values(2,1,0);  
  16.   
  17. insert into t2 values(1,0);  
  18.   
  19. drop procedure if exists pmax;  
  20. drop procedure if exists pmin;  
  21.    
  22. DELIMITER $$  
  23. create procedure pmax ()  
  24. begin  
  25.     declare v_id int;  
  26.     declare v_size int;  
  27.     select max(id) into v_id from t1 where batchid =1;  
  28.       
  29.     update t1 set state=1 where id=v_id;  
  30.     select count(*) into v_size from t1 where state=0 and batchid=1;  
  31.     if v_size=0 then   
  32.         update t2 set state=1 where batchid=1;  
  33.         select * from t2;  
  34.     end if ;  
  35. end $$  
  36.       
  37.       
  38. create procedure pmin ()  
  39. begin  
  40.     declare v_id int;  
  41.     declare v_size int;  
  42.     select min(id) into v_id from t1 where batchid =1;  
  43.       
  44.     update t1 set state=1 where id=v_id;  
  45.     select count(*) into v_size from t1 where state=0 and batchid=1;  
  46.     if v_size=0 then   
  47.         update t2 set state=1 where batchid=1;  
  48.         select * from t2;  
  49.     end if ;  
  50. end $$  
  51.   
  52. DELIMITER ; 


环境:
MySQL 5.6.14 innodb
可重复读隔离级别

业务逻辑:
其中t1表是一个任务表,每个任务有一个id
每一个批次(batchid)可能有多个任务.
如果t1表某个批次所有的任务都完成了,则修改t2表该批次的状态为完成

模拟批次 1  有两个任务 id分别为 1和 2
pmax过程处理 id 为2 的任务, pmin处理id为1 的任务

预期两个过程执行完成,t2 表的状态可以修改为 1, 但是 最终t2表的状态始终都是 0 ,没有得到任何的修改.

这是因为事务隔离,屏蔽了其他线程操作的结果



如果没有加锁读,则不能达到预期的结果.



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29254281/viewspace-2142257/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29254281/viewspace-2142257/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值