DDL이나 DML 중 레코드를 수정/추가/삭제한 것에만 의미가 있음 → SELECT는 읽기만 하므로 트랜잭션을 사용할 이유가 없음
BEGIN과 END 혹은 BEGIN과 COMMIT 사이에 해당 SQL들을 사용
ROLLBACK - BEGIN 뒤에 실행된 문장들이 무효화됨
→ END나 COMMIT이 불리기 전까지는 MySQL사용자에게는 바뀐것 처럼 보이지만 다른 사람들 눈에는 안보임
BEGIN; -- START TRANSACTION
A의 계좌로부터 인출;
B의 계좌로 입금;
END; -- COMMIT
빨간색 형광펜 : 이 명령어들은 마치 하나의 명령어처럼 처리됨. 다 성공하던지 다 실패하던지 둘중의 하나가 됨
모든 레코드 수정/삭제/추가 작업이 COMMIT이 호출될 때까지 커밋되지 않음 → 명시적으로 커밋을 해야함
ROLLBACK이 호출되면 앞서 작업들이 무시됨
BEGIN과 END(COMMIT)/ROLLBACK이 없음 → 트랜잭션이라는 개념이 X
⇒ autocommit 여부는 SQL 클라이언트/라이브러리에 따라 달라짐
⇒ MySQL Workbench 기본은 autocommit이 True
확인 방법: SHOW VARIABLES LIKE 'AUTOCOMMIT'; →출력이 on이면 true
SET autocommit=0 (혹은 1)의 실행으로 변경가능
[사전 테이블 생성]
DROP TABLE IF EXISTS test.hyoin_name_gender; -> 만약 똑같은 이름있으면 충돌이 나니까 삭제
CREATE TABLE test.hyoin_name_gender (
name varchar(16) NOT NULL,
gender enum('Male','Female') default NULL
);
INSERT INTO test.hyoin_name_gender VALUES('Keeyong', 'Male');
INSERT INTO test.hyoin_name_gender VALUES('Jane', 'Female');
INSERT INTO test.hyoin_name_gender VALUES('Unknown'); -> 테이블의 필드보다 값이 적으면 에러
-> 해결방법 : INSERT INTO test.hyoin_name_gender(name) VALUES('Unknown');
INSERT INTO test.hyoin_name_gender VALUES('Keeyong2', 'Male2'); -> Male2은 없는 값이지만 에러는 X 대신 비어있는 문자열("")로 설정
[예제 1] autocommit = True
SHOW VARIABLES LIKE 'AUTOCOMMIT';
-- SET autocommit=1;
SELECT * FROM test.hyoin_name_gender;
BEGIN;
DELETE FROM test.hyoin_name_gender;
INSERT INTO test.hyoin_name_gender VALUES ('Kevin', 'Male');
ROLLBACK;
SELECT * FROM test.hyoin_name_gender;
[예제 2] autocommit = False
SET autocommit=0;
SHOW VARIABLES LIKE 'AUTOCOMMIT';
SELECT * FROM test.hyoin_name_gender;
-- BEGIN이 없음
DELETE FROM test.hyoin_name_gender;
INSERT INTO test.hyoin_name_gender VALUES ('Kevin', 'Male');
ROLLBACK;
SELECT * FROM test.hyoin_name_gender;