1
我有一個存儲過程獲取鎖,運行select,做一些簡單的處理並運行插入。這一年來運行良好,但今天每隔一段時間,連接都會保持鎖定狀態,直到鎖定超時爲止。所以,如果我使用mysql存儲過程不釋放鎖
select IS_USED_LOCK('up_XML_insertUIAudit_lock');
我可以確定哪些連接持有鎖並殺死它。任何想法可能會導致這種情況?
DELIMITER $$
DROP PROCEDURE IF EXISTS `aquadev`.`up_XML_insertUIAudit` $$
CREATE DEFINER=`richard`@`%` PROCEDURE `up_XML_insertUIAudit`(in UserName VARCHAR(45),
in ActionType VARCHAR(45),
in Version VARCHAR(45),
in WaitInterval BIGINT,
in StartAgainTS DATETIME)
BEGIN
declare id int;
declare lockStatus int;
declare WaitIntervalStr VARCHAR(40);
declare StartAgainTSStr VARCHAR(19);
declare Description VARCHAR(255);
set id = null;
select GET_LOCK('up_XML_insertUIAudit_lock',600) into lockStatus;
select max(UIAuditID) into id from UIAudit;
if (id is not null) then
set id = id + 1;
else
set id = 0;
end if;
if (WaitInterval is null) then
set WaitIntervalStr = '';
else
set WaitIntervalStr = convert(WaitInterval,char(40));
end if;
if (StartAgainTS is null) then
set StartAgainTSStr = '';
else
set StartAgainTSStr = convert(StartAgainTS,char(19));
end if;
set Description = concat(WaitIntervalStr,StartAgainTSStr);
insert into UIAudit (UIAuditID,UserName,ActionType,Version,ProcessID,Description,UpdateTS)
values(id,UserName,ActionType,Version,null,Description,now());
select RELEASE_LOCK('up_XML_insertUIAudit_lock') into lockStatus;
END $$
DELIMITER ;
我修改了存儲過程,在插入失敗以測試你的理論。如果失敗,它似乎會釋放鎖。是否有另一個錯誤,我應該用來測試這個? – richs 2009-09-16 19:43:06