MySQL社区

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 2674|回复: 4
打印 上一主题 下一主题

多线程调用存储过程,结果异常,非常奇怪!请各位大侠指教

[复制链接]
跳转到指定楼层
1#
发表于 2016-4-9 15:30:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个比较简单的存储过程单线程调用没有任何问题,4个线程同时调用该这个存储过程则会出现表UT_A部分记录status_code更新不成功的异常,4个线程调用是为了加快更新速度,4个线程调用存储过程传递的参数Asn不一样。存储过程中用了事务。
非常不理解为什么会出现这种情况。
数据库版本为MySQL 5.6.28,引擎为InnoDB。
下面是存储过程的代码。请各位大侠指教,多谢!
CREATE  PROCEDURE `proc_update`(IN Asn VARCHAR(16),IN A_status INT, OUT ret INT)

BEGIN
START TRANSACTION;
       
IF EXISTS(SELECT  A_sn FROM UT_A WHERE UT_A.A_sn = Asn) THEN

                 UPDATE UT_A
                 SET
                 rack_id=rack,
                 shelf_id=shelf,
                 slot_id=slot,
                 status_code=A_status
                 WHERE UT_A.A_sn = Asn;

                 IF (A_status & 0xFFFFFFF9)=0 or ((A_status & 0xFFFFFFF9)=1 and (A_status & 0xFFFFFFFA)=0)  THEN

                        UPDATE UT_op JOIN UT_board         ON UT_board.UTboard_id=UT_op.UTboard_id JOIN UT_slot ON T_slot.UTslot_id=UT_op.UTslot_id                         JOIN UT_A ON UT_A.A_id=UT_board.A_id
                       
                        SET UT_op.status_code=UT_op.status_code & 0xFFFFFFFB
                        WHERE UT_A.A_sn = Asn;

                END IF;
END IF;
COMMIT;
SET ret=0;
               
SELECT ret;
END;
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享淘帖 顶 踩
2#
 楼主| 发表于 2016-4-9 15:34:52 | 只看该作者
再补充一点,如果在Asn加一个普通索引,则问题就不会出现。感觉从道理上讲不通啊。
3#
 楼主| 发表于 2016-4-9 15:38:21 | 只看该作者
表结构如下:
CREATE TABLE `UT_A` (
  `A_id` int(11) NOT NULL AUTO_INCREMENT ,
  `A_sn` varchar(16) DEFAULT NULL ,
  `A_mac` varchar(32) DEFAULT NULL ,
  `A_ip` varchar(32) DEFAULT NULL ,
  `rack_id` int(11) DEFAULT NULL ,
  `shelf_id` int(11) DEFAULT NULL ,
  `slot_id` int(11) DEFAULT '1' ,
  `UTboardslot_sum` int(11) DEFAULT '24' ,
  `status_code` int(11) NOT NULL DEFAULT '0' ,
  PRIMARY KEY (`A_id`),
  KEY `idx_UT_A_A_sn` (`A_sn`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
4#
发表于 2016-4-13 18:41:02 | 只看该作者
A_sn里的值唯一吗?UT_A.status_code只有一个语句去修改它,多线程时,是不是数据相同然后混乱了,你想要什么样的值...
5#
 楼主| 发表于 2016-4-16 11:01:49 | 只看该作者
kider 发表于 2016-4-13 18:41
A_sn里的值唯一吗?UT_A.status_code只有一个语句去修改它,多线程时,是不是数据相同然后混乱了,你想要什 ...

A_sn值唯一,我需要的UT_A.status_code值是根据不同情况有所不同,比如激活是由2更新成7,去激活时由7更新成2
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|小黑屋|Archiver|手机版|MySQL社区 ( 京ICP备07012489号   
联系人:周生; 联系电话:13911732319

GMT+8, 2024-4-29 18:49 , Processed in 0.068696 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表