最近在工作中要实现一个功能,在一个php文件里有一个流水号的变量,每次运行这个php的文件,这个流水号的变量都得不一样,我就想到用mysql的自增来解决,我写了一个存储过程,
CREATE PROCEDURE mqsearch(IN userid int, IN type int, OUT lshs bigint)
BEGIN
INSERT INTO `sztv_mq_search` (`user_id`, `time`, `type`) VALUES (userid, now(), type);
SELECT id INTO lshs FROM `sztv_mq_search` ORDER BY `id` DESC LIMIT 1;
SELECT lshs;
END
为了写这个存储过程,我去查了很多资料,包括存储过程与事务,。下面是我关于事务的理解。
事务是一串sql语句,这些语句要不一起执行成功,要不就失败,但没有等待功能。
两个用户同时执行我上面的存储过程,A用户执行了insert语句,B用户会接着执行insert语句,而不会等待A用户执行select语句,这样就会出现一个问题,
假如开始最大id是2,A用户执行了insert语句后,最大id变成了2,B用户执行了insert语句,最大id变成了3,A用户执行select语句,获取的最大id就变成了3,这不是我要的结果,应此我就把select语句改成了这样
SELECT last_insert_id() INTO lshs;
总结:
存储过程和事务只是保证所有sql语句执行成功,但不能使B事务等待A事务的sql语句全部执行完成后在开始执行
last_insert_id只跟连接有关,有多少的用户执行代码,就打开多少个连接,就有多少个对应的last_insert_id