这个存储过程,多线程下会丢失数据。
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 表中,那么就插入,判断的时候根据 账户和 平台。
------解决思路----------------------
从数据库上是没有错的,所以只能是代码编写的逻辑和你预期不同。