Oracle 23c에 SYS_ROW_ETAG 함수가 추가되었습니다. 이 함수는 칼럼 입력 순서와 무관하게 입력 값에 대한 고유한 32바이트 RAW 값을 반환합니다. 결과 값을 사용하면 데이터 변경 여부를 확인할 수 있습니다.
SYS_ROW_ETAG (([[schema_name.]table_name.]column_name) [,([[schema_name.]table_name.]column_name)]...)
테스트를 위해 아래와 같이 테이블을 생성하겠습니다.
-- 1
DROP TABLE t1 PURGE;
CREATE TABLE t1 (c1 NUMBER, c2 VARCHAR2(1), c3 VARCHAR2(1), c4 VARCHAR2(1));
INSERT INTO t1 VALUES (1, 'A', 'A', 'B');
INSERT INTO t1 VALUES (2, 'A', 'A', 'B');
INSERT INTO t1 VALUES (3, 'A', 'B', 'A');
INSERT INTO t1 VALUES (4, 'A', 'B', 'C');
COMMIT;
아래는 SYS_ROW_ETAG 함수를 사용한 결과입니다. 입력한 칼럼 순서와 무관하게 동일한 값이 반환됩니다.
-- 2
SELECT c1
, SYS_ROW_ETAG (c2, c3, c4) AS sre1
, SYS_ROW_ETAG (c4, c3, c2) AS sre2
FROM t1;
C1 SRE1 SRE2
-- -------------------------------- --------------------------------
1 F3D49F927979FB38E5F95648F0E5466A F3D49F927979FB38E5F95648F0E5466A
2 F3D49F927979FB38E5F95648F0E5466A F3D49F927979FB38E5F95648F0E5466A
3 256AE95E5D7E2ADFBF8164A61A098EB3 256AE95E5D7E2ADFBF8164A61A098EB3
4 E840BF9CB85269C6898B050EEFE5C7A1 E840BF9CB85269C6898B050EEFE5C7A1
4 행이 선택되었습니다.
아래 예제는 SYS_ROW_ETAG 함수를 사용한 Optimistic Locking을 보여줍니다.
-- 3-1: S1
VAR v_etag VARCHAR2(32)
EXEC SELECT SYS_ROW_ETAG (c2, c3, c4) INTO :v_etag FROM t1 WHERE c1 = 1;
-- 3-2: S2
UPDATE t1 SET c2 = 'B' WHERE c1 = 1;
COMMIT;
-- 3-3: S1
UPDATE t1 SET c3 = 'C' WHERE c1 = 1 AND SYS_ROW_ETAG (c2, c3, c4) = :v_etag;
0 행이 업데이트되었습니다.