문제
다음 실행 후 SELECT COUNT(*) FROM ORDERS;의 결과는?
SQLCREATE TABLE ORDERS(ORDER_ID INT PRIMARY KEY, AMOUNT DECIMAL(10,2), STATUS VARCHAR(10) DEFAULT 'PENDING' CHECK(STATUS IN ('PENDING','COMPLETED','CANCELLED'))); INSERT INTO ORDERS VALUES(1, 1000.00, 'PENDING'); INSERT INTO ORDERS VALUES(2, 2000.00, 'COMPLETED'); SAVEPOINT SP_A; INSERT INTO ORDERS VALUES(3, 1500.00, 'PROCESSING'); -- CHECK 제약 위반 UPDATE ORDERS SET AMOUNT = 2500.00 WHERE ORDER_ID = 1; INSERT INTO ORDERS VALUES(4, 3000.00, 'CANCELLED'); ROLLBACK TO SP_A; INSERT INTO ORDERS(ORDER_ID, AMOUNT) VALUES(5, 1800.00); -- DEFAULT 사용 SAVEPOINT SP_B; DELETE FROM ORDERS WHERE STATUS = 'PENDING'; ROLLBACK TO SP_B; COMMIT;
① 2 ② 3 ③ 4 ④ 5
정답
2번
해설
초기 INSERT 2건 성공(ORDER_ID 1: PENDING, ORDER_ID 2: COMPLETED) → SP_A 설정 → CHECK 제약 위반으로 3번 INSERT만 실패하고 트랜잭션은 계속됨 → UPDATE로 ORDER_ID 1의 AMOUNT가 2500.00으로 변경 성공 → 4번 INSERT 성공(ORDER_ID 4: CANCELLED) → 현재 3건 상태 → ROLLBACK TO SP_A로 SP_A 이후의 모든 작업(실패한 3번 INSERT, 성공한 UPDATE, 성공한 4번 INSERT) 취소되어 다시 2건 → INSERT로 ORDER_ID 5가 DEFAULT 'PENDING'과 함께 추가되어 3건 → SP_B 설정 → DELETE로 PENDING 상태 레코드들(ORDER_ID 1, 5) 삭제하여 1건 → ROLLBACK TO SP_B로 DELETE 취소되어 다시 3건 → COMMIT으로 최종 확정. 따라서 최종 결과는 3건입니다.