我在mysql中有一个存储过程来执行需要同步的任务,这样如果两个应用程序调用存储过程,只有一个可以访问一段代码来执行任务,让另一个被阻塞直到第一个一个完成任务。
DELIMITER $$
CREATE PROCEDURE SP_GEN_ID(IN NAME VARCHAR(20))
BEGIN
DECLARE maxLen int default 0;
START TRANSACTION;
#the section of code that needs to be synchronized
COMMIT
END;
$$
DELIMITER ;
因此,如果两个应用程序同时调用存储过程,则任务必须同步。
一种。但是Start TRANSACTION和COMMIT没有同步执行。
湾。并且 LOCK TABLES tableA也不能在存储过程中使用以确保同步。
C。我试图在应用程序级别同步存储过程调用。我用了
boost_interprocess scoped_lock lock();
它在 boost 1.41 中运行良好
但是 boost 1.34 库不支持进程间锁定互斥锁,这在我的情况下是可用的。
有没有办法同步代码的存储过程部分,这样当同时进行两个调用时,一个在另一个被执行之前被阻塞?
(添加了以下)编辑的代码:给出一个想法,我想在存储过程的同步块中执行什么。
它获取最后分配的 id,并将其加一并检查它是否未用于其他“名称”记录。找到有效 id 后,更新最后分配的 id 记录表,然后将其与给定的“名称”相关联。
DELIMITER $$
CREATE PROCEDURE SP_GEN_ID(IN NAME VARCHAR(20))
BEGIN
DECLARE maxLen int default 0;
START TRANSACTION;
#the section of code that needs to be synchronized
SELECT lastid into lastgenerated FROM DB_last_id WHERE key = 'NAME_ID';
findid_loop:
LOOP
set lastid = lastid + 1;
#this is to check whether it was assigned with someother name before.
IF not EXISTS (SELECT 1 FROM user_name_id WHERE name_id = lastgenerated) then
set nameid = lastgenerated;
set found = true;
LEAVE findid_loop;
END IF;
#for loop limit check
IF (counter < loopLimit) then
set counter = counter + 1;
ITERATE findid_loop;
ELSE
#reached the limit and not found.
LEAVE findid_loop;
END IF;
END LOOP findid_loop;
#if a valid id, update last id and assign to name.
IF (found) THEN
#update the id.
update DB_last_id set lastid = nameid where key = 'NAME_ID';
insert into user_name_id values (nameid ,name);
ELSE
#return an empty string for the application to take action on the failure.
set nameid = '';
END IF;
#end transaction here.
COMMIT
END;
$$
DELIMITER ;