CodeGym /Java Course /All lectures for KO purposes /동시 트랜잭션의 문제

동시 트랜잭션의 문제

All lectures for KO purposes
레벨 1 , 레슨 882
사용 가능

1.1 소개

그리고 이제 재미가 시작됩니다. 트랜잭션이 작동하는 방식에 대한 이론입니다. 다른 스레드에서 동일한 데이터를 변경할 때 시스템 작동을 유지하는 방법은 무엇입니까? 아니면 다른 트랜잭션에서 하나의 트랜잭션을 실행하시겠습니까? 우리는 트랜잭션 격리를 연구하여 이러한 질문에 대한 답을 찾기 시작할 것입니다 ...

트랜잭션 격리 수준은 DBMS에서 논리적으로 병렬 트랜잭션을 수행한 결과 일관성 없는 데이터가 허용되는 범위를 결정하는 조건값입니다. 트랜잭션 격리 수준의 척도에는 가장 낮은 값에서 가장 높은 값으로 순위가 매겨진 여러 값이 포함됩니다. 더 높은 격리 수준은 더 나은 데이터 일관성에 해당하지만 이를 사용하면 물리적으로 병렬 트랜잭션의 수가 줄어들 수 있습니다.

반대로 낮은 격리 수준은 더 많은 병렬 트랜잭션을 허용하지만 데이터 정확도는 떨어집니다. 따라서 정보 시스템 개발자가 사용하는 트랜잭션 격리 수준을 선택하면 어느 정도 작업 속도와 시스템에서 수신된 데이터의 보장된 일관성 보장 사이에서 선택이 가능합니다.

트랜잭션을 사용한 동시 액세스 문제

트랜잭션이 병렬로 실행될 때 다음과 같은 문제가 발생할 수 있습니다.

  • 업데이트 손실 - 하나의 데이터 블록이 다른 트랜잭션에 의해 동시에 변경되면 마지막 변경 사항을 제외한 모든 변경 사항이 손실됩니다.
  • "더티" 읽기 (eng. 더티 읽기) - 트랜잭션에 의해 추가되거나 변경된 데이터 읽기(이후 확인되지 않음(롤백))
  • non-repeatable read (eng. non-repeatable read) - 동일한 트랜잭션 내에서 다시 읽을 때 이전에 읽은 데이터가 변경됩니다.
  • 팬텀 읽기 - 실행 중 하나의 트랜잭션이 여러 번 동일한 기준에 따라 많은 행을 선택합니다. 이러한 페치 사이의 다른 트랜잭션은 첫 번째 트랜잭션의 페치 기준에 사용된 일부 행의 행을 추가하거나 열을 수정하고 성공적으로 종료됩니다. 결과적으로 첫 번째 트랜잭션에서 동일한 선택이 다른 행 세트를 제공한다는 것이 밝혀질 것입니다.

이러한 문제가 발생할 수 있는 상황을 고려하십시오.

1.2 잃어버린 업데이트

하나의 데이터 블록이 다른 트랜잭션에 의해 동시에 변경될 때 변경 사항 중 하나가 손실되는 상황.

동시에 실행되는 두 개의 트랜잭션이 있다고 가정합니다.

트랜잭션 1 트랜잭션 2
업데이트 tbl1 SET f2=f2+20 WHERE f1=1; 업데이트 tbl1 SET f2=f2+25 WHERE f1=1;

두 트랜잭션 모두에서 f2 필드의 값이 변경되며 완료 시 필드 값을 45만큼 증가시켜야 합니다. 실제로 다음과 같은 일련의 작업이 발생할 수 있습니다.

  1. 두 트랜잭션 모두 필드의 현재 상태를 동시에 읽습니다. 여기에는 정확한 물리적 동시성이 필요하지 않으며 다른 트랜잭션이 결과를 쓰기 전에 순서대로 두 번째 읽기 작업이 완료되는 것으로 충분합니다.
  2. 두 트랜잭션 모두 이전에 읽은 값에 각각 20과 25를 더하여 새 필드 값을 계산합니다.
  3. 트랜잭션은 계산 결과를 필드 f2에 다시 쓰려고 시도합니다. 동시에 두 개의 쓰기를 수행하는 것은 물리적으로 불가능하기 때문에 실제로 쓰기 작업 중 하나는 먼저 수행되고 다른 하나는 나중에 수행됩니다. 두 번째 쓰기 작업은 첫 번째 작업의 결과를 덮어씁니다.

결과적으로 f2 필드의 값은 두 트랜잭션이 모두 완료되면 45가 아니라 20 또는 25 증가할 수 있습니다. 즉, 데이터 변경 트랜잭션 중 하나가 "사라집니다".

1.3 "더티" 읽기

나중에 커밋(롤백)에 실패할 트랜잭션에 의해 추가되거나 수정된 ​​데이터 읽기.

다음 SQL 문을 실행하는 서로 다른 응용 프로그램에서 열린 두 개의 트랜잭션이 있다고 가정합니다.

트랜잭션 1 트랜잭션 2
업데이트 tbl1 SET f2=f2+1 WHERE f1=1;
f1=1인 tbl1에서 f2를 선택합니다.
롤백 작업;

트랜잭션 1에서 필드 f2의 값이 변경되고 트랜잭션 2에서 이 필드의 값이 선택됩니다. 그 후 트랜잭션 1이 롤백되고 결과적으로 두 번째 트랜잭션에서 받은 값과 데이터베이스에 저장된 값이 달라집니다.

1.4 반복 불가능 읽기

동일한 트랜잭션 내에서 다시 읽을 때 이전에 읽은 데이터가 변경된 것으로 판명되는 상황.

다음 SQL 문을 실행하는 서로 다른 응용 프로그램에서 열린 두 개의 트랜잭션이 있다고 가정합니다.

트랜잭션 1 트랜잭션 2
f1=1인 tbl1에서 f2를 선택합니다.
업데이트 tbl1 SET f2=f2+3 WHERE f1=1;
저지르다;
f1=1인 tbl1에서 f2를 선택합니다.

트랜잭션 2에서 필드 f2의 값이 선택된 다음 트랜잭션 1에서 필드 f2의 값이 변경됩니다. 트랜잭션 2의 필드 f2에서 값을 다시 선택하려고 하면 다른 결과가 나옵니다. 이 상황은 데이터를 부분적으로 수정하고 데이터베이스에 다시 쓰기 위해 데이터를 읽을 때 특히 받아들일 수 없습니다.

1.5 "팬텀" 읽기

동일한 트랜잭션 내에서 반복적으로 읽는 동안 동일한 선택이 다른 행 집합을 제공하는 상황입니다.

다음 SQL 문을 실행하는 서로 다른 응용 프로그램에서 열린 두 개의 트랜잭션이 있다고 가정합니다.

트랜잭션 1 트랜잭션 2
tbl1에서 합계(f2)를 선택합니다.
tbl1(f1,f2) 값(15,20)에 삽입;
저지르다;
tbl1에서 합계(f2)를 선택합니다.

트랜잭션 2는 필드 f2의 모든 값을 사용하는 SQL 문을 실행합니다. 그런 다음 새 행이 트랜잭션 1에 삽입되어 트랜잭션 2의 SQL 문이 다시 실행되어 다른 결과가 생성됩니다. 이러한 상황을 팬텀 리딩(phantom reading)이라고 합니다. 데이터 자체의 변경/삭제 때문이 아니라 새로운(팬텀) 데이터의 출현으로 인해 데이터에 반복적으로 액세스한 결과가 변경되었다는 점에서 반복 불가능 읽기와 다릅니다.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION