簡體   English   中英

MySQL 存儲過程在錯誤時無法回滾

[英]MySQL Stored Procedure fails to ROLLBACK on ERROR

如果事務中的任何語句失敗,我會嘗試回滾事務。

這些表是 InnoDB 和SELECT 'ROLLBACK'被觸發,所以我知道 ROLLBACK 也應該是。

事務不回滾。 任何想法為什么?

DELIMITER $$
DROP PROCEDURE IF EXISTS spTest;
CREATE PROCEDURE `spTest`(
    IN vUserID BIGINT,
    IN vSessionRef VARCHAR(50)
)

BEGIN
    DECLARE vUserSessionID BIGINT;
    DECLARE vUserSessionIDVersionCurr INT;
    DECLARE vUserSessionIDVersionNew INT;   
    
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        SELECT 'ROLLBACK'; /* This is returned so we know the error was triggered */
        ROLLBACK; 
    END;


    START TRANSACTION;
        SELECT UserSessionID INTO vUserSessionID FROM tblUserSessions WHERE UserID = vUserID AND SessionRef = vSessionRef AND isCurrent = 1 ORDER BY VersionStartDateTime DESC LIMIT 1;
        SELECT VersionID INTO vUserSessionIDVersionCurr FROM tblUserSessions WHERE UserID = vUserID AND SessionRef = vSessionRef AND isCurrent = 1 ORDER BY VersionStartDateTime DESC LIMIT 1;  

        DROP TABLE IF EXISTS tmpUserSessionCurr;
        CREATE TEMPORARY TABLE tmpUserSessionCurr SELECT * FROM tblUserSessions WHERE UserID = vUserID AND SessionRef = vSessionRef AND isCurrent = 1 ORDER BY VersionStartDateTime DESC LIMIT 1;
        
        /* This inserted record is not rolled back */
        INSERT INTO tblUserSessions (UserSessionID, EntityID, SessionRef, UserID, ValidUntil, CreatedOn, CreatedBy, LastUpdatedOn, LastUpdatedBy, isDeleted, isCurrent)
        SELECT vUserSessionID, EntityID, SessionRef, UserID, (now() + INTERVAL 5 MINUTE), CreatedOn, CreatedBy, NOW(), 'spUserSessionCreate', 0, 1 FROM tmpUserSessionCurr;
        
        /* Deliberately using a wrongly spelt field name in the statement below to trigger and exception in order to test the rollback*/
        SELECT VersionID INTO vUserSessionIDVersionNew FROM tblUserSessions WHERE UserID = vUserID AND SessionRef = vSessionRef AND NOW() BETWEEN VersionStartDateTime AND ValidUntil AND isCurrent = 1 ORDER BY VersionStartDateTime DESC LIMIT 1;
    
        UPDATE tblUserSessions 
        SET LastUpdatedBy = "spUserSessionCreate", isCurrent = 0, VersionEndDateTime = NOW() 
        WHERE UserSessionID = vUserSessionID AND VersionID = vUserSessionIDVersionCurr;
        
        SELECT 'UPDATED' AS vStatus, UserSessionID, VersionID, EntityID, SessionRef, UserID, CreatedOn, ValidUntil FROM tblUserSessions WHERE UserID = vUserID AND SessionRef = vSessionRef AND NOW() BETWEEN VersionStartDateTime AND ValidUntil AND isCurrent = 1 ORDER BY VersionStartDateTime DESC LIMIT 1; 
        
        /* -------------------- */
        SELECT 'COMMIT';
        COMMIT;  /* In the even of a SQL Error, this point will not be reached */
    /* -------------------- */


END
$$
DELIMITER ;

我推測事務中的某些東西一定會影響回滾,所以看看不需要的東西,最后的SELECT語句和DROP TABLE

看起來DROP TABLE是罪魁禍首。 我將它移到(之前)事務之外,並且回滾工作正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM