2009-09-16 87 views
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 ; 

回答

1

如果程序錯誤在RELEASE_LOCK()之前,它就不會被釋放。

爲什麼不直接使用交易?

+0

我修改了存儲過程,在插入失敗以測試你的理論。如果失敗,它似乎會釋放鎖。是否有另一個錯誤,我應該用來測試這個? – richs 2009-09-16 19:43:06