티스토리 뷰

여러 개의 INSERT문이 연속적으로 실행될 때는 트랜젝션이 필수이다.

 

파일이 도중에 에러가 나면 일부 데이터만 디비에 저장될 것이기 때문에

트랜젝션을 적용하여 적정한 때에 롤백이 되도록 해야 한다.

 

이 때 주의해야 할 점은 autocommit 이다.

autocommit이 활성화되어 있으면 하나의 sql문마다 하나의 트랜젝션을 디비가 알아서 생성한다.

쿼리 하나 실행, commit 자동 실행.

다시 쿼리 하나 실행, commit 자동 실행.

이런 식으로 말이다.

 

비활성화되어 있을 때는 직접 commit 명령을 실행하지 않으면 쿼리문이 작동하지 않을 것이다

쿼리 실행, commit 직접 실행!

 

 

 

mysql, mariadb의 디폴트 autocommit 값은 1(enabled) 이다. 

소스에서 트랜젝션, rollback, commit을 구현할 때는 autocommit여부를 고려해야 한다.

 

1. autocommit = 0 -> sql 실행 -> commit 실행

SET AUTOCOMMIT=0;     
sql 여러 개 실행
COMMIT / ROLLBACK;                   
sql 여러 개 실행
COMMIT / ROLLBACK;                    
SET AUTOCOMMIT=1;

// SET AUTOCOMMIT=1;   를 해주지 않으면 그 후의 sql들은 COMMIT/ROLLBACK 명령 없이 실행되지 않는다

 

2. autocommit 설정 변경 없이 transaction 시작

START TRANSACTION;  
sql 여러 개 실행
COMMIT / ROLLBACK;    
START TRANSACTION; 
sql 여러 개 실행
COMMIT / ROLLBACK;                    

sql 실행

 

 

무작정 예문보고 autocommit 비활성화 했다가

첫번째 commit  뒤의 sql문들이 실행되지 않아(뒤의 sql에서는 commit을 실행하지 않았으니) 한참을 삽질했다...

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

[MySQL] 여러 행을 하나의 행과 여러 열로 출력  (0) 2022.07.08
댓글