-
트랜젝션 :: 프로시져 활용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