我有一个存储过程mysql这是执行需要同步的任务,如果两个应用程序调用存储过程,只有一个可以访问一段代码来执行任务,保持另一个被阻止,直到第一个完成任务。在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 ;
因此,如果两个应用程序同时调用存储过程,则任务必须同步。
a。但开始交易和COMMIT没有同步执行。
b。和LOCK TABLES TABLEA不能在存储过程中使用,以确保同步了。
c。我试图在应用程序级别同步存储过程调用。我用
boost_interprocess scoped_lock lock();
它在提升1.41
但进程间锁定互斥的工作完全正常的助推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 ;
你的表使用什么存储引擎?他们必须是InnoDB才能进行交易/锁定工作。 – eggyal
存储引擎是InnoDB的表。但它似乎还没有工作。为了验证这一点,我做了一个睡眠(15),在START TRANSACTION之后立即等待15秒。当我同时调用存储过程时,两者似乎在15秒后出现。如果START TRANSACTION确保同步,则在存储过程的第二次调用应该在30秒左右后结束。对? (第一次来电15秒,然后第二次进入START TRANSACTION,睡15秒) –
你想要同步的代码是什么?如果您只是希望SQL操作是原子操作,那么在事务中执行它们应该可以实现这一点。如果您正在影响其他状态,如系统变量,则需要获取专用于此目的的表/记录的锁定。在第二次调用中没有延迟并不一定表示锁失败(例如,可能存在缓存问题,使第二次调用比第一次调用更快;或者第二次调用可能执行不同的执行第一条路径)。请提供完整的代码。 – eggyal