ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 트랜젝션 :: 프로시져 활용
    DB/MySQL 2020. 7. 6. 10:40

    MySQL 의 단점 중하나는 Commit 과 RollBack 인 것 같다.

    기본적으로 Transaction ( 절차 ) 관련 기능이 부재하여 이를 Procedure를 구성하여 대체할 수 있다.

    Procedure ( 함수 ) 의 장점은 오류가 발생할 경우, 모든 작업은 RollBack 할 수 있다.

    그렇다면, 여기서 Error를 Catch 하는 방법이 가장중요하다.

     

    Procedure 를 Call 할 때의 Params 오류는 코드작성 시 별도로 확인해주어야하지만,

    Procedure의 내부에서 발생한 오류는 SQLEXCEPTION 의 핸들러를 활용하여 기록할 수 있다.

     

    코드는 아래의 목적을 표현하기위해 작성되었다.

    1. Error Logging

    2. Json Parsing

    3. Transaction

    4. Return Check

    5. Get Increment key value

     

    DROP PROCEDURE IF EXISTS `DAO_PROCEDURE`
    DELIMITER $$
    CREATE DEFINER=`root`@`localhost` PROCEDURE `DAO_PROCEDURE`(
    	OUT RESULT INT,
        OUT _ID INT,
    	# Params
            IN $id INT
    )
    BEGIN
        DECLARE _WR_OPTION VARCHAR(100);
        /* 에러로그 관련 변수 */
        DECLARE v_vch_proc_name varchar(100) DEFAULT 'DAO_PROCEDURE';
        DECLARE v_iny_proc_step tinyint UNSIGNED DEFAULT 0;
        DECLARE v_txt_call_stack text;
        DECLARE v_vch_sql_state varchar(5);
        DECLARE v_int_error_no int;
        DECLARE v_txt_error_msg text;
    	/* 만약 SQL에러라면 ROLLBACK 처리한다. */
    	DECLARE exit handler for SQLEXCEPTION
    	  BEGIN
            GET DIAGNOSTICS CONDITION 1 v_vch_sql_state = RETURNED_SQLSTATE
                , v_int_error_no = MYSQL_ERRNO
                , v_txt_error_msg = MESSAGE_TEXT;
     
            ROLLBACK;
     
            SET v_txt_call_stack = CONCAT('{"mb_id":', IF($mb_id IS NULL, 'null', $mb_id)
                , ',"action":', CONCAT("INSERT SAMPLE : ", $title_kor)
                , ',"datetime":', $wr_datetime
                , '}'
            );
     
            INSERT `error_log` (`proc_name`, `proc_step`, `sql_state`, `error_no`, `error_msg`, `call_stack`, `proc_call_date`, `log_date`)
            VALUES (v_vch_proc_name, v_iny_proc_step, v_vch_sql_state, v_int_error_no, v_txt_error_msg, v_txt_call_stack, $wr_datetime, NOW(0));
     
            SET RESULT = -1;
     
            RESIGNAL;
    	END;
    
    	/* 트랜젝션 시작 */
    	START TRANSACTION;
    		/* TABLE 정보입력 */
    			INSERT INTO `Table`
    			(`Columns`, ..., `Columns`) 
    			VALUE
    			(`Values`, ..., `Values`);
    		/* FK_ID :: REFERENCSING */
    			SET _ID = last_insert_id();
                
    	/* 커밋 */
    	COMMIT;
    	SET RESULT = 0;
    END$$
    DELIMITER ;
    

    'DB > MySQL' 카테고리의 다른 글

    MySQL Dump :: 버전경고  (0) 2020.06.29
    MySQL 8 :: 암호정책  (0) 2020.06.29
    DML :: INSERT  (0) 2020.06.16
    조건인출 :: Column  (0) 2020.06.16
    테이블 목록 구하기  (0) 2020.06.16

    댓글

Designed by Tistory.