AD JB Toolbox 01

MariaDB 강좌 / 트랜잭션 시작하기: InnoDB·COMMIT·ROLLBACK

트랜잭션은 여러 데이터 변경을 하나의 확정 단위로 묶는 기능입니다. InnoDB에서 START TRANSACTION으로 시작해 결과가 맞으면 COMMIT, 잘못되었으면 ROLLBACK으로 끝내며, 같은 연결과 아직 확정하지 않은 범위라는 조건을 지켜야 합니다.

모두 성공해야 하는 작업 묶음 정하기

두 잔액 숫자를 함께 바꾸는 학습 예제로 트랜잭션의 확정·취소를 비교합니다. 한쪽만 바뀐 상태를 남기지 않으려는 것이 핵심입니다. 실제 결제·송금 시스템의 구현을 제공하는 예제는 아니며, 그러한 업무에는 원장·중복 요청 방지·권한·감사 등 별도 설계가 필요합니다. 실제 수정·삭제 결과를 취소하는 예는 UPDATE·DELETE를 실행하기 전 대상 행 확인하기, 동시 연결의 충돌은 두 연결로 격리 수준·잠금·교착 상태 확인하기에서 확인합니다. 호출자가 확정을 맡는 서버 작업은 저장 프로시저·함수·트리거의 차이와 사용 방법에서도 같은 경계를 사용합니다.

명령 역할 주의
START TRANSACTION 현재 연결에서 변경 묶음 시작 진행 중 트랜잭션을 모르고 중첩하지 않음
COMMIT 현재 변경 확정 이후 ROLLBACK으로 이전 상태 복구 불가
ROLLBACK 미확정 변경 취소 다른 연결·구조 변경까지 취소하지 않음
autocommit 명시적 트랜잭션 밖 자동 확정 값만 보고 현재 범위를 단정하지 않음

InnoDB 전용 테이블과 초기값 준비하기

course_user로 shopcourse에 접속해 서버·DB를 확인합니다. accounts_35_lab이 없는지 확인하고 아래 전체 코드를 실행합니다. 같은 이름이 있으면 먼저 정의·데이터를 확인하며 기존 자료를 덮어쓰지 않습니다.

USE shopcourse;
CREATE TABLE accounts_35_lab (
 account_id INT PRIMARY KEY,balance DECIMAL(12,2) NOT NULL CHECK(balance>=0)
) ENGINE=InnoDB;
INSERT INTO accounts_35_lab VALUES(1,10000),(2,5000);
SELECT @@autocommit,@@in_transaction;
SHOW CREATE TABLE accounts_35_lab;

엔진은 InnoDB, 초기값은 1번 10000.00·2번 5000.00입니다. 명시적 트랜잭션의 효과를 비교하기 위해 두 연결을 섞지 말고 한 연결에서 순서대로 실행합니다. 테이블 생성은 시작 전 끝냅니다.

변경 후 확인하고 ROLLBACK으로 취소하기

START TRANSACTION;
SELECT account_id,balance FROM accounts_35_lab
WHERE account_id IN (1,2) ORDER BY account_id FOR UPDATE;
UPDATE accounts_35_lab SET balance=balance-3000
WHERE account_id=1 AND balance>=3000;
SELECT ROW_COUNT() AS debit_rows;

debit_rows가 1일 때만 계속합니다. 0이거나 오류가 나면 이 연결에서 ROLLBACK;을 실행하고 아래의 입금 UPDATE를 실행하지 않습니다.

UPDATE accounts_35_lab SET balance=balance+3000 WHERE account_id=2;
SELECT ROW_COUNT() AS credit_rows;

credit_rows도 1이어야 합니다. 예상과 다르면 ROLLBACK;으로 두 변경을 취소하고 중단합니다. 둘 다 1일 때 다음 조회로 잔액을 대조합니다.

SELECT account_id,balance FROM accounts_35_lab ORDER BY account_id;

초기값 그대로라면 debit_rows와 credit_rows는 각각 1이고 잔액은 7000.00·8000.00입니다. 각 변경 직후 예상 건수가 아니면 다음 변경을 진행하지 말고 ROLLBACK합니다. 이 문장 묶음을 임의 입력에 대한 자동 처리 코드로 그대로 사용하면 안 되며, 프로그램에서는 오류·건수 검사에 따른 분기가 필요합니다.

ROLLBACK;
SELECT account_id,balance FROM accounts_35_lab ORDER BY account_id;

취소 후 10000.00·5000.00으로 돌아옵니다. 트랜잭션 안에서 본 변경과 확정된 변경을 구분해야 합니다. 결과가 다르면 같은 연결인지, 도구가 중간에 COMMIT하지 않았는지 확인합니다.

동일한 변경을 반복하고 COMMIT으로 확정하기

앞 절의 출금·입금·최종 조회 블록을 같은 순서로 다시 실행하고 각 행 수를 확인합니다. 이번에는 두 행 수와 잔액이 맞을 때만 ROLLBACK 대신 아래 COMMIT을 실행합니다.

COMMIT;
SELECT account_id,balance FROM accounts_35_lab ORDER BY account_id;

확정 후 값은 7000.00·8000.00이며 같은 초기값으로 되돌리는 ROLLBACK은 더 이상 작동하지 않습니다. 재실습은 별도 초기화 절차로 하며, 업무 데이터에서 반대 숫자를 더하는 작업을 복구와 동일시하지 않습니다. START TRANSACTION과 확정 단위를 참고하세요.

오류·잠금·암묵적 확정의 경계 확인하기

문장 하나의 오류가 언제나 트랜잭션 전체를 자동 취소하는 것은 아닙니다. 오류 종류와 드라이버 처리를 확인하고 프로그램에서는 전체 작업의 실패 처리를 명시합니다. 잠금을 오래 잡은 채 사용자 입력을 기다리지 않고 가능한 한 짧게 처리합니다.

CREATE TABLE·ALTER TABLE·DROP TABLE·TRUNCATE 같은 구조 작업은 암묵적 확정 등 다른 규칙을 가지므로 이 실습 안에 섞지 않습니다. MyISAM처럼 비트랜잭션 엔진을 InnoDB 예제와 같은 취소 동작으로 생각해서도 안 됩니다. 외부 API·파일 전송은 DB ROLLBACK만으로 취소되지 않습니다.

연결을 정리하고 새 실습 준비하기

실행이 중간에 멈췄다면 현재 연결에서 ROLLBACK으로 미확정 범위를 정리하고 @@in_transaction을 확인합니다. 보관할 자료가 없는 accounts_35_lab만 삭제해 처음부터 재실습할 수 있습니다. 삭제는 구조 작업이며 취소용 트랜잭션 밖에서 합니다.

ROLLBACK;
DROP TABLE shopcourse.accounts_35_lab;
같은 카테고리의 다른 글
MariaDB 강좌 / CREATE TABLE로 테이블 구조 정의하기

MariaDB 강좌 / CREATE TABLE로 테이블 구조 정의하기

상품 테이블을 예로 열·타입·기본값·기본키·저장 엔진을 정의하고 실제 생성 결과를 확인합니다. 기존 테이블 처리, IF NOT EXISTS의 한계와 안전한 반복 실습 방법도 설명합니다.

MariaDB 강좌 / 윈도 함수로 누적 합계와 이전·다음 행 비교하기

MariaDB 강좌 / 윈도 함수로 누적 합계와 이전·다음 행 비교하기

누적 합계와 LAG·LEAD를 계산하고 동점 데이터로 ROWS·RANGE를 비교합니다. 날짜 필터를 누적 전후에 적용한 결과와 정렬·기간 경계를 확인합니다.

MariaDB 강좌 / SELECT로 열 선택하기: 별칭·계산식·DISTINCT

MariaDB 강좌 / SELECT로 열 선택하기: 별칭·계산식·DISTINCT

SELECT의 열 선택과 AS 별칭, 행별 계산식, DISTINCT의 열 조합 기준을 실습합니다. 원본 데이터와 출력 결과를 구분하고 WHERE에서 별칭을 사용할 때의 주의점을 설명합니다.

MariaDB 강좌 / NULL을 올바르게 비교하기: IS NULL·COALESCE

MariaDB 강좌 / NULL을 올바르게 비교하기: IS NULL·COALESCE

NULL·빈 문자열·0을 구분하고 IS NULL·IS NOT NULL과 COALESCE의 역할을 실습합니다. 일반 비교에서 빠지는 NULL 행, NULL-safe 비교와 NOT IN 목록의 함정을 설명합니다.

MariaDB 강좌 / 서버 설정·SQL 모드·시간대·로그 확인하기

MariaDB 강좌 / 서버 설정·SQL 모드·시간대·로그 확인하기

설정 파일·GLOBAL·SESSION의 차이를 기준으로 MariaDB 동작을 확인합니다. SQL 모드 오류와 TIMESTAMP·DATETIME 시간대 실습, 로그 조건 점검 및 변경 복구 절차를 제공합니다.

MariaDB 강좌 / 첫 실습: 상품 테이블을 만들고 데이터를 넣어 조회하기

MariaDB 강좌 / 첫 실습: 상품 테이블을 만들고 데이터를 넣어 조회하기

상품 세 건을 저장하는 전체 SQL로 테이블 생성·입력·조회 과정을 실습합니다. 구조와 행 수, 가격·재고 조건의 예상 결과를 확인하고 반복 입력 오류와 실습 테이블 초기화 범위를 구분합니다.

MariaDB 강좌 / 테이블 관계 설계하기: 일대다·다대다·외래키

MariaDB 강좌 / 테이블 관계 설계하기: 일대다·다대다·외래키

고객·상품·주문·상세 네 테이블로 일대다와 다대다 관계를 설계합니다. 복합키·주문 당시 단가·외래키 실패 입력과 삭제 제한을 실행하고 업무상 삭제 정책을 구분합니다.

MariaDB 강좌 / 날짜와 시간 저장하기: DATE·DATETIME·TIMESTAMP

MariaDB 강좌 / 날짜와 시간 저장하기: DATE·DATETIME·TIMESTAMP

DATE·DATETIME·TIMESTAMP의 저장 의미와 시간대 처리를 비교합니다. 동일 입력의 한국 시간·UTC 조회 결과, 버전별 TIMESTAMP 범위, 날짜 오류와 설정 복원을 실습합니다.

MariaDB 강좌 / 복제 구조와 지연·오류·장애 대응 이해하기

MariaDB 강좌 / 복제 구조와 지연·오류·장애 대응 이해하기

빈 두 서버를 준비하는 로컬 Compose 구성과 복제 상태·지연·오류 진단을 설명합니다. 적용 중지·재개를 관찰하고 백업과 장애 승격의 경계를 구분합니다.

MariaDB 강좌 / 데이터베이스 만들기: CREATE DATABASE·USE·문자 집합

MariaDB 강좌 / 데이터베이스 만들기: CREATE DATABASE·USE·문자 집합

shopcourse 데이터베이스를 만들고 현재 연결의 작업 대상으로 선택합니다. utf8mb4와 collation, 기존 DB에서 IF NOT EXISTS의 한계, 권한·문자 설정 확인을 예제로 설명합니다.