[개념정리] Transaction , Lock

2021. 1. 8. 17:31프로그래밍-Science/데이터베이스

DB의 concurrency를 컨트롤하는 대표적인 방법이 Lock이다.

이는 하나의 트랜젝션이 실행되는 동안, 특정 데이터 항목에 대해 다른 트랜젝션이 접근하지 못하게 만드는 것.

 

- Transaction

 

DB는 기본적으로 All or Nothing 방식을 취한다. 즉, DB에 Insert되는 상황에 대해서는 모두성공 또는 모두실패라는 결과 중 하나만 리턴한다는 것이다. 이 전략을 위해 취하는 것이 트랜젝션이다. 얘는 더이상 나누어지지 않는 하나의 단위다.

트랜젝션은 조금이라도 오류가 발생하면 모두 Rollback함으로써 Nothing의 결과를 리턴한다.

 

이 트랜젝션은 Atomicity, Consistency, Isolation, Durability의 특징을 갖는다.

Atomicity은 All or Nothing을 의미하고,

Consistency는 트랜잭션 실행 후 DB상태에 모순이 없어야됨을

Isolation은 트랜젝션 중간에 다른 트랜잭션이 접근할 수 없음을,

Durability는 실행이 완료되면 DB에 결과가 영구저장됨을 말한다.

 

이 중, Lock과 관련이 깊은 Isolation에 대해 생각해보자

저 네가지 항목은 사용자가 설정함에 따라 강하게도, 그리고 약하게도 설정할 수 있다

요런식의 Dirty Read나

 

요런식의 Phantom Read가 발생할 수 있다

이러한 상황을 방지하기 위해 Lock을 사용한다. Lock은 DB단위든, 로우 단위든, 테이블 단위든 다양한 범위에 대해 걸 수 있다.(보통 테이블Lock은 DDL Lock이라고 한다) 얘는 두 가지로 나눌 수 있다. 

 

Shared Lock: Read Lock. 즉 데이터를 Read할 때 사용된다. Read과정에서 데이터가 변하면 안되므로, 읽는건 허용하되 쓰는 것을 잠근다. Exclusive Lock과 동시에 적용할 수 없다. 

 

Exclusive Lock: Write Lock. Update시 사용하고, 다른 트랜젝션이 접근할 수 없다. 데이터를 쓰는 과정에서는 단 한개의 트랜젝션만 적용되어야 한다. 즉, 읽기, 쓰기 모두 안되게 잠근다.

 

대표적인 Lock문제가 Dead Lock이다

한번의 트랜젝션에 두 자원에 대한 Update와 Read가 있는데, Read대상이 서로가 Update하는 대상이라면, 둘 다 wait하느라 commit이 이루어지지 않는다.

'프로그래밍-Science > 데이터베이스' 카테고리의 다른 글

[개념정리] DLL  (0) 2021.01.14