트랜잭션 제어
트랜잭션 제어는 SQL 연산의 일괄처리가 완전히 실행되거나 전혀 실행되지 않도록 보장함으로써 데이터베이스 무결성을 구현합니다. 트랜잭션 제어 명령은 BEGIN, COMMIT 및 ROLLBACK입니다.
자동 커밋 트랜잭션 모드가 지원됩니다. 이 모드에서는 모든 SQL 명령이 실행 시에 커미트됩니다. 시스템이 BEGIN SQL 명령 이전에 SQL 명령을 발견하는 경우, 이는 자동 커미트 트랜잭션 모드로 SQL 명령을 실행합니다. 시스템이 BEGIN SQL 명령을 발견하는 경우, 이는 트랜잭션 내의 모든 연속 SQL 명령을 실행합니다. 트랜잭션을 종료하려면 COMMIT 또는 ROLLBACK SQL 명령을 실행해야 합니다.
일부 SQL 명령은 BEGIN/COMMIT 트랜잭션 블록 내에서 사용이 금지됩니다. 예를 들어,
- BEGIN
- [CREATE | DROP] DATABASE
- ALTER TABLE [ADD | DROP] COLUMN 연산
- SET AUTHENTICATION
- [SET | DROP] CONNECTION
- GROOM TABLE
- GENERATE STATISTICS
- SET SYSTEM DEFAULT HOSTKEY
- [CREATE | ALTER|DROP] KEYSTORE
- [CREATE | DROP] CRYPTO KEY
- SET CATALOG
- SET SCHEMA dbname.schemaname(여기서 dbname은 현재 데이터베이스가 아님)
이러한 SQL 명령은 Netezza Performance Server 저장 프로시저 본문 내에서도 금지됩니다. 트랜잭션 블록 또는 스토어드 프로시저 내에서 이 명령 중 하나를 사용하는 경우, 시스템은 다음 메시지와 유사한 오류를 표시합니다.
ERROR: CREATE DATABASE: may not be called in a transaction block or stored procedure
참고: 동시 세션에서는 다음과 같은 오류가 발생할 수 있습니다Cannot
insert a duplicate key into unique index. 이 문제는 동일한 데이터베이스 및 스키마에 연결된 세션이 여러 개 있고 해당 세션에서 사용자가 트랜잭션 블록을 시작하고 동일한 object_name을 사용하여 CREATE OBJECT object_name 명령을 실행하는 경우에 발생합니다. 해당 object_name에 대한 모든 후속 CREATE 명령은 첫 번째 CREATE 명령이
커미트될 때까지 대기하며, 나머지 CREATE object_name 명령은 중복 키 오류로 실패합니다. 첫 번째 CREATE OBJECT object_name 명령이 롤백하는 경우,
시스템은 해당 object_name에 대한 CREATE 명령을 실행한 다음 세션/트랜잭션 블록으로 이동합니다.
그리고 해당 object_name에 대한 나머지 CREATE 명령은 명령은 중복 키 오류로 실패합니다. 테이블 오브젝트의 경우, 트랜잭션 블록 내의 IF NOT EXISTS 구문은 object_name에 대한
후속 CREATE TABLE 명령이 중복 키 오류로 실패하는 것을 방지하지 않습니다.