반응형
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
반응형
'program story' 카테고리의 다른 글
| 아무것도 출력하지 않는 Python 로깅 (0) | 2020.11.28 |
|---|---|
| Akka-액터의 인스턴스를 몇 개 만들어야합니까? (0) | 2020.11.28 |
| 키가 존재하지 않는 맵의 값을 읽으면 어떻게됩니까? (0) | 2020.11.28 |
| CSS를 사용하여 웹 양식의 특정 컨트롤 주위에 그룹 상자 만들기 (0) | 2020.11.28 |
| Android : 인 텐트를 통해 특정 폴더를 열고 파일 브라우저에 해당 콘텐츠를 표시하는 방법은 무엇입니까? (0) | 2020.11.28 |