免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6006 | 回复: 2

mysql存储过程线程安全问题? [复制链接]

论坛徽章:
1
亥猪
日期:2013-10-30 23:29:55
发表于 2014-02-20 17:34 |显示全部楼层
现在有一个创建订单的存储过程,主要是插入用户信息到用户表,同时将订单信息插入订单表:

表userinfo字段:

  1. id;     // 自增主键
  2. uid;   // 唯一索引
  3. balance;
复制代码
表rechargeinfo:
  1. id;  // 自增主键
  2. uid;
  3. rechargetime;
  4. status;
  5. amount;
复制代码
部分存储过程如下:

  1. begin
  2. declare v_count  int;
  3. declare v_status varchar(50);
  4. select  count(uid) into v_count  from userinfo where uid=p_userId;
  5. START TRANSACTION;
  6. if v_count <= 0 then
  7. insert into userinfo(uid, balance) values(p_userId, 0);
  8. end if;

  9. // ...
  10. commit;
复制代码
这里有一个check-then-act的if判断,线上观察,如果两个线程同时到达if,并且此时userinfo表中没有uid,都会进入insert,就会报Duplicate entry异常,不知道这里需要怎么修改?

论坛徽章:
8
CU大牛徽章
日期:2013-09-18 15:20:48CU大牛徽章
日期:2013-09-18 15:20:58CU大牛徽章
日期:2013-09-18 15:21:06CU大牛徽章
日期:2013-09-18 15:21:12CU大牛徽章
日期:2013-09-18 15:21:17天秤座
日期:2013-10-30 14:01:03摩羯座
日期:2013-11-29 18:02:31luobin
日期:2016-06-17 17:46:36
发表于 2014-02-27 09:42 |显示全部楼层
@suanmeilizhi
select  count(uid) into v_count  from userinfo where uid=p_userId for update;
查询的时候将这个记录的X获取,其他事物想要获取X锁,就要等当前事物提交,也就避免了你说的情况。

论坛徽章:
1
亥猪
日期:2013-10-30 23:29:55
发表于 2014-02-28 12:56 |显示全部楼层
回复 2# chinafenghao


    这样一来,是不是每次都只能一个线程访问这个存储过程了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP