当前位置: 代码迷 >> Sql Server >> 多线程操作Mysql有关问题
  详细解决方案

多线程操作Mysql有关问题

热度:65   发布时间:2016-04-24 09:15:43.0
多线程操作Mysql问题
这个存储过程,多线程下会丢失数据。

CREATE DEFINER=`root`@`%` PROCEDURE `game_register1`(IN `_status` int,IN `_account` varchar(64),IN `_password` varchar(64),IN `_platform` int)
BEGIN
#Routine body goes here...
DECLARE _id BIGINT;
SET _id = -1;
SELECT userid INTO _id FROM game_user.account WHERE account=_account AND platform=_platform;
IF _id < 0 THEN
INSERT INTO game_user.account(status,account,password,platform) SELECT _status,_account,_password,_platform FROM DUAL WHERE NOT EXISTS(SELECT * FROM game_user.account WHERE account=_account AND platform=_platform);
SELECT userid INTO _id FROM game_user.account WHERE account=_account AND platform=_platform;
IF LAST_INSERT_ID() = _id  then
SELECT 1,_id;
ELSE
SELECT -2;
END IF;
ELSE
SELECT -1;
END IF;
END
;;

昨天经过测试,问题出在 : INSERT INTO game_user.account(status,account,password,platform) SELECT _status,_account,_password,_platform FROM DUAL WHERE NOT EXISTS(SELECT * FROM game_user.account WHERE account=_account AND platform=_platform);     
 WHERE NOT EXISTS(SELECT * FROM game_user.account WHERE account=_account AND platform=_platform);  去掉这部分代码,数据不会丢失,前者数据会丢失。
不太理解为何会出现这种状况 ,希望能帮忙分析下。
------解决思路----------------------


是mysql的问题,

WHERE NOT EXISTS(SELECT * FROM game_user.account WHERE account=_account AND platform=_platform);  

这个应该是判断如果当前要插入的值,如果不存在于 game_user.account 表中,那么就插入,判断的时候根据 账户和 平台。
------解决思路----------------------
从数据库上是没有错的,所以只能是代码编写的逻辑和你预期不同。
  相关解决方案