이 질문에 대한 대답은 DBMS에에 의존하는 경우, 내가 오라클 11g 이상 및 SQL Server에 대한 대답을 듣고 싶네 2012직렬화 INSERT들
우리가 참조하는 외래 키가있는 테이블을 자체 :
CREATE TABLE Versions (
Id INT IDENTITY(1,1) NOT NULL,
[Date] DATETIME NOT NULL,
BasedOnVersion INT NULL -- foreign key that references Versions
)
Versions
테이블에 새 레코드를 삽입하는 저장 프로 시저가 있습니다.
How it should run
Transaction 1 reads current version 17
Transaction 1 writes new version 18 based on 17
Transaction 2 reads current version 18
Transaction 2 writes new version 19 based on 18
How it should NOT run
Transaction 1 reads current version 17
Transaction 2 reads current version 17
Transaction 1 writes new version 18 based on 17
Transaction 2 writes new version 19 based on 17
:이 동시에 실행하는 경우, 우리는 두 개의 버전이 동일한 다른 버전을 참조 없기 때문에 (우리가 의도적으로 포크를 만드는 제외) 버전 계층 구조에있는 포크가 안된다는 것을 확인해야 두 번째 경우에는 동일한 버전을 기반으로하는 두 가지 버전이 있습니다.
두 트랜잭션을 직렬화하는 방법이 필요합니다. 먼저 ISOLATION LEVEL SERIALIZABLE
을 사용하려고 생각했지만 격리 수준은 INSERTs
에 아무런 영향을 미치지 않으므로 해결 방법이 아닙니다.
또 다른 방법은 트랜잭션 시작시 Versions
테이블의 잠금을 획득하는 것입니다. 오라클의 LOCK TABLE IN EXCLUSIVE MODE
은 트랜잭션 2가 테이블을 읽지 못하도록하기 때문에 SQL 서버에서는 작동하지만 오라클에서는 작동하지 않습니다.
그래서 이런 종류의 문제에 가장 적합한 해결책은 무엇입니까?