program story

MySQL : 저장 프로 시저 내의 트랜잭션

inputbox 2020. 11. 28. 09:16
반응형

MySQL : 저장 프로 시저 내의 트랜잭션


내 저장 프로 시저의 기본 구조는 다음과 같습니다.

BEGIN

    .. Declare statements ..

    START TRANSACTION;

        .. Query 1 ..
        .. Query 2 ..
        .. Query 3 ..

    COMMIT;

END

MySQL 버전 : 5.1.61-0ubuntu0.11.10.1-log

현재 'query 2'가 실패하면 'query 1'의 결과가 커밋됩니다.

  • 쿼리가 실패한 경우 트랜잭션을 롤백하려면 어떻게해야합니까?

http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html을 살펴보십시오.

기본적으로 롤백을 호출하는 오류 처리기를 선언합니다.

START TRANSACTION;

DECLARE EXIT HANDLER FOR SQLEXCEPTION 
    BEGIN
        ROLLBACK;
        EXIT PROCEDURE;
    END;
COMMIT;

rkosegi의 코드에 대한 대안 일뿐입니다.

BEGIN

    .. Declare statements ..

    DECLARE EXIT HANDLER FOR SQLEXCEPTION 
    BEGIN
          .. set any flags etc  eg. SET @flag = 0; ..
          ROLLBACK;
    END;

    START TRANSACTION;

        .. Query 1 ..
        .. Query 2 ..
        .. Query 3 ..

    COMMIT;
    .. eg. SET @flag = 1; ..

END

다음은 오류시 롤백하고 오류 코드를 반환하는 트랜잭션의 예입니다.

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `SP_CREATE_SERVER_USER`(
    IN P_server_id VARCHAR(100),
    IN P_db_user_pw_creds VARCHAR(32),
    IN p_premium_status_name VARCHAR(100),
    IN P_premium_status_limit INT,
    IN P_user_tag VARCHAR(255),
    IN P_first_name VARCHAR(50),
    IN P_last_name VARCHAR(50)
)
BEGIN

    DECLARE errno INT;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
    GET CURRENT DIAGNOSTICS CONDITION 1 errno = MYSQL_ERRNO;
    SELECT errno AS MYSQL_ERROR;
    ROLLBACK;
    END;

    START TRANSACTION;

    INSERT INTO server_users(server_id, db_user_pw_creds, premium_status_name, premium_status_limit)
    VALUES(P_server_id, P_db_user_pw_creds, P_premium_status_name, P_premium_status_limit);

    INSERT INTO client_users(user_id, server_id, user_tag, first_name, last_name, lat, lng)
    VALUES(P_server_id, P_server_id, P_user_tag, P_first_name, P_last_name, 0, 0);

    COMMIT WORK;

END$$
DELIMITER ;

이것은 자동 커밋이 0으로 설정되어 있다고 가정합니다. 이것이 도움이되기를 바랍니다.

참고 URL : https://stackoverflow.com/questions/9974325/mysql-transaction-within-a-stored-procedure

반응형