我有一個存儲過程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