当你有一个主键表时,发现数据没有,就向里面插入数据。当多线程调用时,可能存在与两个或两个以上的线程判断到数据不存在,同时去插入数据。此时主键就会发生冲突,报错。
停止报错的方法就是在存储过程中开启事务去发现错误,然后制止这个行为。
BEGIN DECLARE iid INT DEFAULT 0; DECLARE t_error TINYINT DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error = 1; SELECT UserID INTO iid from fish_game_status WHERE UserID = User_ID; IF iid = 0 THEN START TRANSACTION;##插入的时候开启事务,捕捉错误回滚 INSERT INTO fish_game_status VALUES(User_ID,Statu); IF t_error = 1 THEN ROLLBACK; ELSE COMMIT; END IF; ELSE UPDATE fish_game_status SET GameStatus = Statu WHERE UserID = User_ID; END IF; END