brb tea가 말했듯이 데이터베이스 구현 및 사용하는 알고리즘 (MVCC 또는 2 단계 잠금)에 따라 다릅니다.
CUBRID (오픈 소스 RDBMS) 는 이 두 가지 알고리즘의 개념을 설명 합니다.
첫 번째는 T2 트랜잭션이 A 레코드를 변경하려고 할 때 T1 트랜잭션이 이미 A 레코드를 변경했음을 알고 T2 트랜잭션이 T1 트랜잭션이 커밋 또는 롤링되는지 여부를 알 수 없기 때문에 T1 트랜잭션이 완료 될 때까지 기다립니다. 뒤. 이 방법을 2PL (Two-phase locking)이라고합니다.
다른 하나는 각각의 T1 및 T2 트랜잭션이 자신의 변경된 버전을 갖도록 허용하는 것입니다. T1 트랜잭션이 A 레코드를 1에서 2로 변경 한 경우에도 T1 트랜잭션은 원래 값 1을 그대로두고 A 레코드의 T1 트랜잭션 버전이 2라고 씁니다. 그러면 다음 T2 트랜잭션이 A 레코드를 변경합니다. 2에서 4가 아닌 1에서 3으로, A 레코드의 T2 트랜잭션 버전이 3이라고 씁니다.
T1 트랜잭션이 롤백 될 때 T1 트랜잭션 버전 인 2가 A 레코드에 적용되지 않는지 여부는 중요하지 않습니다. 그 후 T2 트랜잭션이 커밋되면 T2 트랜잭션 버전 인 3이 A 레코드에 적용됩니다. T1 트랜잭션이 T2 트랜잭션 이전에 커밋되면 A 레코드가 2로 변경된 다음 T2 트랜잭션 커밋시 3으로 변경됩니다. 최종 데이터베이스 상태는 다른 트랜잭션에 영향을주지 않고 각 트랜잭션을 독립적으로 실행하는 상태와 동일합니다. 따라서 ACID 속성을 만족합니다. 이 방법을 MVCC (Multi-version concurrency control)라고합니다.
MVCC는 메모리의 오버 헤드 증가 (동일한 데이터의 다른 버전을 유지해야하기 때문에) 및 계산 (REPETEABLE_READ 수준에서는 업데이트를 잃을 수 없으므로 Hiberate와 같은 데이터 버전을 확인해야 함)의 비용으로 동시 수정을 허용합니다. Optimistick Locking 과 함께 합니다.)
2PL 트랜잭션 격리 수준에서 다음을 제어합니다 .
트랜잭션 격리 수준을 선택해도 데이터 수정을 보호하기 위해 획득 한 잠금에는 영향을주지 않습니다. 트랜잭션은 해당 트랜잭션에 대해 설정된 격리 수준에 관계없이 항상 수정하는 모든 데이터에 대해 배타적 잠금을 얻고 트랜잭션이 완료 될 때까지 해당 잠금을 유지합니다. 읽기 작업의 경우 트랜잭션 격리 수준은 주로 다른 트랜잭션에 의해 수정 된 영향으로부터 보호 수준을 정의합니다.
격리 수준이 낮 으면 많은 사용자가 동시에 데이터에 액세스 할 수있는 능력이 향상되지만 더티 읽기 또는 업데이트 손실과 같은 동시성 효과의 수가 증가합니다 .
SQL Server의 잠금과 격리 수준 간의 관계에 대한 구체적인 예 (READ_COMMITTED_SNAPSHOT = ON 인 READ_COMMITED를 제외하고 2PL 사용)
READ_UNCOMMITED : 다른 트랜잭션이 현재 트랜잭션에서 읽은 데이터를 수정하지 못하도록 공유 잠금을 실행하지 마십시오. READ UNCOMMITTED 트랜잭션은 현재 트랜잭션이 수정되었지만 다른 트랜잭션에 의해 커밋되지 않은 행을 읽지 못하게하는 배타적 잠금에 의해 차단되지 않습니다. [...]
READ_COMMITED :
- READ_COMMITTED_SNAPSHOT이 OFF (기본값)로 설정된 경우 : 공유 잠금을 사용하여 현재 트랜잭션이 읽기 작업을 실행하는 동안 다른 트랜잭션이 행을 수정하지 못하도록합니다. 공유 잠금은 또한 다른 트랜잭션이 완료 될 때까지 다른 트랜잭션에 의해 수정 된 행을 읽지 못하도록 명령문을 차단합니다. [...] 다음 행이 처리되기 전에 행 잠금이 해제됩니다. [...]
- READ_COMMITTED_SNAPSHOT가 ON으로 설정된 경우 데이터베이스 엔진은 행 버전 관리를 사용하여 문 시작시 존재했던 데이터의 트랜잭션 적으로 일관된 스냅 숏을 각 문에 제공합니다. 잠금은 다른 트랜잭션에 의한 업데이트로부터 데이터를 보호하는 데 사용되지 않습니다.
REPETEABLE_READ : 공유 잠금은 트랜잭션의 각 문에서 읽은 모든 데이터에 적용되며 트랜잭션이 완료 될 때까지 유지됩니다.
SERIALIZABLE : 범위 잠금은 트랜잭션에서 실행되는 각 문의 검색 조건과 일치하는 키 값 범위에 배치됩니다. [...] 범위 잠금은 트랜잭션이 완료 될 때까지 유지됩니다.