[英]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.