데이터베이스 트랜잭션과 잠금 사이의 정확한 관계는 무엇입니까?


16

이것은 나의 지식을 키우는 정신에서 제기되는 겸손한 질문입니다. 친절하게 대답하십시오.

오랜 응용 프로그램 개발자 인 저는 어떤 수준에서 거래가 무엇인지 알고 있습니다 (항상 사용합니다). 트랜잭션 격리 수준을 제쳐두고, 높은 수준에서 트랜잭션을 수행하면 작업 블록이 완전히 완료되거나 전혀 완료되지 않으며 다른 데이터베이스 수정 작업과 일정량의 격리가 허용됩니다.

또한 (다양한 데이터베이스에서) 잠금이 무엇인지 또는 적어도 어떻게 동작하는지 알고 있습니다 (테이블을 명시 적으로 명시 적으로 잠그면 다른 프로세스 또는 스레드가 해당 테이블에 대해 아무것도 업데이트 할 수 없음).

내가 가장 명확하게 알지 못하는 것은 다양한 데이터베이스에서 명시 적으로 행이나 테이블을 잠글 때 데이터베이스 트랜잭션 기능이 커버 아래에서 트랜잭션을 올바르게 작동시키기 위해 사용하는 것과 동일한 구조를 사용하고 있습니까?

즉, 트랜잭션이 원자적이고 격리되기 위해서는 잠금을 수행해야합니다. 이 트랜잭션 시작, trasction-hidden 잠금은 다양한 데이터베이스가 SELECT FOR UPDATE명시 적 LOCK명령 과 같은 구성을 통해 액세스 할 수있는 것과 동일한 종류의 잠금 입니까? 아니면이 두 개념이 완전히 다른가요?

다시 한 번이 질문에 대해 사과드립니다. 나는 더 많은 기초 자료를 지적하게되어 기쁩니다.

답변:


12

명시 적으로 행이나 테이블을 잠글 때 트랜잭션이 제대로 작동하도록 데이터베이스 트랜잭션 기능에서 덮개와 동일한 구조를 사용합니까?

예. 이것이 사실이 아닌 경우, 자신의 '잠금'은 다른 유사한 '잠금'에만 적용되며 엔진 자체 잠금과 상호 작용하지 않습니다. 따라서 테이블에서 행을 잠그면 같은 방식으로 다른 응용 프로그램에서 잠글 수 없지만 엔진 자체에서는 잠금이 무시됩니다. 이러한 의미는 거의 요구되지 않습니다. 대부분의 경우 애플리케이션이 행을 잠그면 '액세스 / 수정 수단에 대해 잠금'을 의미합니다. 엄격 응용 프로그램 고유의 잠금 메커니즘이 있다는 측면 메모 할 수는 그들이 유용하기 때문에, 존재한다. 예를 들어 SQL Server에는 응용 프로그램 잠금이 있습니다.

트랜잭션이 원자적이고 격리되기 위해서는 잠금이 필요합니다.

잠금은이를 달성하기위한 수단 중 하나입니다. 주요 대안은 버전 관리입니다. 요즘 대부분의 데이터베이스는 두 가지를 모두 지원합니다 (또한 앱에서 행을 '잠그는'반면 다른 트랜잭션이 버전 관리를 사용하여 행을 읽는 경우 잠금이 버전 화 된 읽기를 차단하지 않기 때문에 읽습니다).

데이터베이스 구현 세계에서 '2 단계 잠금 프로토콜' 이라고 알려진 개념을 둘러싼 것 입니다. 링크 된 Wikipedia 기사는 좋은 시작입니다. 이 주제에 대한 자세한 설명을 읽으려면 라이브러리로 가서 트랜잭션 처리 : 개념 및 기술 에 대한 대출을 요청하십시오 . 거의 모든 데이터베이스가 핵심적으로 그 책의 구현입니다.


아마도 당신은 (잠금 없음) 낙관적 동시성 제어
ypercubeᵀᴹ

아하! 이제 이야기하고 있습니다. 사실, 내 마음 뒤에 숨어있는 것은 MVCC 였습니다. 잘 표현 된 답변, 훌륭한 참고 자료, 시간을 내서 실제로 내 질문에 파고 들어 주셔서 감사합니다.
Laird Nelson

3

질문에 대답하기 전에 몇 가지 배경 :

참고 : 이것은 Microsoft SQL Server-RDBMS .......와 관련이 있습니다.

  • 간단히 말해서 트랜잭션 은 전체적으로 단일 논리 단위로 수행해야하는 작업 시퀀스이며 ACID 속성을 유지해야합니다.
  • 모든 RDBMS는 트랜잭션 격리와 내구성을 유지하여 트랜잭션을 완전히 완료하는 데 사용할 수있는 "잠금 기능"을 제공해야합니다. 이것은 데이터베이스의 물리적 무결성을 보장합니다.
  • 가장 중요한 것은 기본적으로 트랜잭션이 연결 수준에서 관리된다는 것입니다. 따라서 연결에서 트랜잭션이 시작되면 해당 연결에서 실행 된 모든 T-SQL 문 (S / I / U / D)은 트랜잭션이 끝날 때까지 트랜잭션의 일부입니다. ( 화성 은 다르게 취급됩니다)

이제 질문으로 돌아가십시오.

명시 적으로 행이나 테이블을 잠글 때 트랜잭션이 제대로 작동하도록 데이터베이스 트랜잭션 기능에서 덮개와 동일한 구조를 사용합니까?

예. 이는 수정 될 데이터 시퀀스를 결정하고 데이터베이스를 일관성있는 상태로 유지하는 데주의를 기울여야한다는 것을 의미합니다. 즉, DML 작업은 데이터베이스를 일관된 상태로 유지하여 조직의 비즈니스 규칙에 국한해야합니다. 여전히 RDBMS (여기서는 SQL Server)는 트랜잭션의 물리적 무결성을 강제 할 수 있습니다.

BOL에서 : 잠금 및 행 버전 관리는 사용자가 커밋되지 않은 데이터를 읽지 못하게하고 여러 사용자가 동일한 데이터를 동시에 변경하려고 시도하지 못하게합니다. 잠금 또는 행 버전 관리가 없으면 해당 데이터에 대해 실행 된 쿼리는 데이터베이스에서 아직 커밋되지 않은 데이터를 반환하여 예기치 않은 결과를 생성 할 수 있습니다.

이 트랜잭션 시작 트랜잭션 숨김 잠금은 다양한 데이터베이스에서 SELECT FOR UPDATE 또는 명시 적 LOCK 명령과 같은 구문을 통해 액세스 할 수있는 것과 동일한 잠금 유형입니까?

SQL Server의 모든 것은 트랜잭션에 포함됩니다. 데이터에 액세스 할 때 RDBMS는 격리 수준과 데이터에서 수행중인 작업에 따라 잠금을 설정해야합니다. 자세한 내용은 답변을 확인 하십시오.

좋은 참고 자료 :


2

트랜잭션이 데이터베이스 "인터페이스"의 일부라고 말하면 개발자가 트랜잭션 시작, 종료, 트랜잭션 범위 내에서 수행 할 작업 등을 결정한다는 것입니다. 잠금은 구현 세부 사항에 속합니다. 다른 객체에 대한 액세스 동기화에 사용됩니다. 대부분의 경우 엔진 자체는 잠그는 시간과 기간을 결정합니다. 직접 조작 할 수없는 많은 시스템 레벨 잠금이 있습니다 (예 : 엔진이 특정 메모리 영역을 잠글 수 있음). DML 잠금과 관련하여도 많은 것들이 뒤에서 발생합니다 (예를 들어, 참조 무결성 Oracle을 보장하기 위해, 그리고 제가 기억하는 한 SQLServer는 새 레코드가 삽입되면 마스터 테이블의 해당 행에 잠금을 둘 수 있습니다) 세부 사항 표) 트랜잭션 내에서 발행 된 DML 문의 결과.

트랜잭션과 관련하여 SQL을 준수하고 트랜잭션을 지원한다고 주장하는 RDMS에서 다소 일관된 동작을 기대할 수 있지만 잠금에 관해서는 거의 모든 공급 업체가 서로 다른 전략과 용어를 사용합니다. 내가 알 수있는 한 모든 RMDS에서 공통적 인 부분은 트랜잭션 간의 동시성은 격리 수준으로 정의되는 반면 잠금 간의 동시성은 잠금 유형 (공유, 독점 등)에 의해 제어된다는 것입니다.

요약하면 잠금은 객체의 일관성과 동시성을 제어하는 ​​저수준 메커니즘입니다. SQL 문 실행 중에 잠금을 발행 할 수 있습니다. 트랜잭션 격리 수준 구현에 따라 엔진은 영향을받는 개체 (행, 행 그룹, 인덱스 등)에 서로 다른 유형의 잠금을 적용 할 수 있습니다. 잠금 ( SELECT FOR UPDATE, LOCK) 을 수동으로 발행하는 데 사용할 수있는 명령 수가 제한되어 있습니다 . DML 잠금을 에스컬레이션 할 수 있습니다 (예 : RDMS에 따라 (예 : SQLServer 행-> 페이지-> 파티션-> 테이블)). 연결 시작, 백업, 복원, 프로 시저 / 트리거 / 함수 / etc 재 컴파일, 시작, 종료 등 동안 데이터베이스 엔진에 의해 잠금이 발행 될 수도 있습니다.

그 질문에 대한 답변인지 확실하지 않지만 이해가 되시기 바랍니다.


당신의 의견에 감사드립니다. 당신은 확실히 지금까지 가장 가깝습니다. 나는 트랜잭션이 항상 명시 적 LOCK또는 SELECT FOR UPDATE진술에 의해 또는 다른 메커니즘을 통해 사용되는 잠금 측면에서 구현되는지 확인하려고 노력하고 있습니다 .
Laird Nelson

내가 아는 한, BEGIN TRANSACTION그 자체로는 잠금이 없습니다. 트랜잭션 내에서 DML 뒤에 잠금이 나타납니다.
a1ex07

설명-나는 BEGIN TRANSACTION그 자체가 DML 잠금을 만들지 않는다는 것을 의미 했다. 실제로 자원을 할당하고, 활성 트랜잭션을 보유하는 시스템 테이블 (있는 경우)에 항목을 추가해야하기 때문에 실제로 일부 내부 잠금을 발행해야합니다.
a1ex07

1

SQL Server 전문 용어를 사용하지만 개념은 다른 공급 업체와 동일해야합니다.

실행하는 모든 명령은 트랜잭션 내에서 실행됩니다. 해당 트랜잭션은 BEGIN TRAN을 사용하여 명시 적으로 또는 데이터베이스 엔진에 의해 내재적으로 열 수 있습니다. 암시 적 트랜잭션이 열린 이유는 엔진이 여전히 ACID 준수 및 롤백 기능을 유지해야하기 때문입니다.

SELECT FOR UPDATE를 수행하면 트랜잭션이 진행되는 동안 특정 잠금이 유지된다는 의미입니다.


당신의 의견에 감사드립니다. 내가 아는 많은 것. 그러나 내 질문은 여전히 ​​그 거래가 열릴 때 자체 잠금을 유지하여 격리가 이루어 집니까? 그렇다면 해당 잠금은 명시 적으로 획득 할 수있는 동일한 종류의 잠금입니까? 아니면 거래가 다른 수단을 통해 격리를 달성합니까?
Laird Nelson

2
예, 이것은 동일한 메커니즘입니다. 두 모드에서 잠금을 사용하여 격리를 수행 할 수 있으며, 명시 적으로 획득 할 수있는 동일한 잠금입니다. 차이점은 트랜잭션을 명시 적으로 열지 않으면 명령이 완료되면 잠금이 해제되는 반면 명시 적 트랜잭션에서는 커밋 할 때까지 잠금이 유지된다는 것입니다 (분리 수준으로 인해 100 % 정확하지는 않지만 일반적인 아이디어).
Matan Yungman

당신의 의견에 감사드립니다. 내 질문을하는 이유는 일부 데이터베이스에서 ACVC 트랜잭션을 수행하는 수단으로 MVCC를 사용한다는 것을 읽었 기 때문에 잠금이없는 방법 인 것처럼 보입니다. 그런 경우, 언제 명시 적으로 잠금을 발행하고 싶을지는 명확하지 않습니다. 그러나 그것은 아마도 별도의 질문 일 것입니다. :-)
Laird Nelson

@LairdNelson SQL Server 의 스냅 샷 격리 수준 입니다. 기존이지만 동시성에 대한 기본 메커니즘은 아닙니다. IIRC 인 Oracle 또는 Postgresql의 기본값입니다.
Marian

0

잠금이 필요하며 데이터베이스를 만듭니다. 이렇게하면 여러 사용자가 데이터베이스에 쓰는 동안 여러 사용자가 읽으려고 할 때 데이터가 손상되거나 무효화되지 않습니다. 트랜잭션 격리는 일반적으로 트랜잭션에서 액세스되는 모든 것을 잠그면 구현됩니다. 잘못된 디자인 응용 프로그램은 데이터베이스 잠금 개념을 크게 활용합니다. :) !! 따라서 FK 및 데이터 레이아웃에 집중하지 마십시오.

ACID에 관한 모든 것 : -이 글을 읽으면 마음이 맑아 질 것입니다! ACID는 데이터베이스를 수정할 때 적용 할 속성 집합입니다.

  • ** 원자력
  • 일관성
  • 격리
  • 내구성**

트랜잭션은 일부 ACID 속성을 달성하는 데 사용되는 일련의 관련 변경 사항입니다. 트랜잭션은 ACID 속성을 달성하기위한 도구입니다.

원 자성이란 모든 트랜잭션이 발생하거나 전혀 수행되지 않도록 보장 할 수 있음을 의미합니다. 복잡한 작업을 하나의 단일 장치로 또는 전혀 또는 전혀 수행 할 수 없으며 충돌, 정전, 오류 또는 기타 다른 작업을 수행하면 관련 변경 중 일부만 발생한 상태가 될 수 없습니다.

일관성은 데이터의 일관성을 보장한다는 것을 의미합니다. 관련 데이터에 대한 제약 조건 중 어느 것도 위반되지 않습니다.

격리는 한 트랜잭션이 아직 완료되지 않은 다른 트랜잭션에서 데이터를 읽을 수 없음을 의미합니다. 두 개의 트랜잭션이 동시에 실행되는 경우 각 트랜잭션은 순차적으로 실행중인 것처럼 세상을보고 다른 트랜잭션이 작성한 데이터를 읽어야하는 경우 다른 트랜잭션이 완료 될 때까지 기다려야합니다.

내구성은 트랜잭션이 완료되면 모든 변경 사항이 내구성있는 매체 (예 : 하드 디스크)에 기록되었음을 보증하며 트랜잭션이 완료된 사실도 기록됩니다.

따라서 트랜잭션은 이러한 속성을 보장하는 메커니즘입니다. 그것들은 전체적으로 하나의 작업 그룹이 원자적일 수 있고 일관된 결과를 생성하며 다른 작업과 분리되며 지속적으로 기록 될 수 있도록 관련 작업을 그룹화하는 방법입니다.


귀하의 의견에 감사드립니다. 나는 ACID의 속성을 적어도 수동적으로 알고 있습니다. 여전히 명확하지 않은 것은 트랜잭션이 명시 적 LOCK문을 통해 직접 사용할 수있는 것과 동일한 종류의 잠금을 사용하여 ACID를 구현 합니까, 아니면 다른 메커니즘을 사용하여 수행합니까?
Laird Nelson

데이터베이스는 데이터를 선택할 때 발생하는 잠금 수준을 제어하는 ​​여러 트랜잭션 격리 수준을 제공합니다 .Serializable, Repeatable reads, Read commit, Read uncommitted.
Up_One
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.