티스토리 뷰

DBMS(DataBaseManagementSystem) 즉, 데이터베이스 관리 시스템은 여러 사용자가 데이터베이스에 동시에 접근할 수 있다. 여러 사용자가 동시에 접근하면 트랜잭션도 동시에 여러개가 실행 되는데 DBMS는 여러 트랜잭션을 동시에 실행하기 위해 병행 수행을 지원한다. 그리고 이 병행 수행이 잘 이루어지도록 하기 위해서 병행 제어를 실시한다.


병행 수행


여러 사용자가 데이터베이스에 접근할 때 여러 트랜잭션이 수행되는데 이 여러 트랜잭션들을 병행 수행 시키는 방식이다. 이는 마치 운영체제가 멀티 프로세스를 지원하는 것과 비슷한 모양이다.

여러 트랜잭션을 수행하는 순서가 중요하므로 트랜잭션 스케줄 이라고 부르는 스케줄 순서에 따라 트랜잭션을 실행한다. 다음은 트랜잭션 스케줄의 종류이다.



직렬 스케줄

인터리빙(Interleaving)방식을 사용하지 않고 각 트랜잭션을 순차적으로 수행시키는 방식

* 인터리빙(Interleaving) : 트랜잭션을 연산 단위로 번갈아가며 수행하는 방식. 운영체제의 시분할 방식과 비슷하다.


비직렬 스케줄

인터리빙 방식을 사용해 트랜잭션을 병행 수행시키는 방식. 병행 수행이 비직렬 스케줄에 포함된다.


직렬 가능 스케줄

직렬 스케줄처럼 정확한 결과를 생성하는 비직렬 스케줄






비직렬 스케줄을 사용해서 여러 트랜잭션을 수행할 때 적절한 병행 제어 기법이 사용되지 않으면 다음과 같은 문제들이 발생할 수 있다.



갱신 분실(Lost Update)

하나의 트랜잭션이 수행한 데이터 변경 연산이 저장되기 전에 다른 트랜잭션이 데이터를 가지고 가서 데이터를 변경하고 다시 저장하는 경우 첫번째 트랜잭션이 수행한 연산은 무효가 된다.


 데이터 

[Number]

 Transaction A

 Transaction B

 100

 데이터를 가지고 온다. (100)

 

 100

 

 데이터를 가지고 온다. (100)

 100

 가지고 온 값에 10을 더한다. (110)

 

 100

 

 가지고 온 값에 2를 곱한다. (200)

 110

 연산 결과를 저장한다. (110)

 

 200

  연산 결과를 저장한다. (200)

* Transaction A가 먼저 실행되었기 때문에 결과는 220이 되어야 하지만 Transaction A의 연산이 분실되었다.






모순성(Inconsistency)

트랜잭션이 여러개의 데이터를 변경하는 연산을 할 때 동일하지 않은 시간에 각각의 데이터를 가지고 오면 연산의 일관성이 사라져 모순이 생긴다. 갱신 분실과 비슷해 보이지만 여러 데이터를 가져올 때 발생하는 문제라는 점에서 다르다.


 데이터

[Vector]

 Transaction A

 Transaction B

 (100, 100)

 x값을 가지고 와서 20을 더한다.. (100+20)

 

 (120, 100)

 x값을 저장한다. (120) 

 (120, 100)

 

 vector를 통째로 가지고 온다. ((120, 100))

 (240, 100)

 

 가지고 온 값에 2를 곱한다. ((240, 200))

 (240, 200)

 

 연산 결과를 저장한다. ((240, 200))

 (240, 200)

 y값을 가지고 와서 20을 더한다. (200+20)

 

 (240, 220)

 y연산 결과를 저장한다. (220) 

* 결과는 (240, 240)이 되어야 하지만 가져오는 데이터의 일관성이 없어서 모순이 발생했다.






연쇄 복귀(Cascading Rollback)

트랜잭션에 장애가 발생해서 rollback 연산을 하려면 해당 트랜잭션이 사용했던 데이터를 사용한 다른 트랜잭션들도 rollback을 수행해야 하는데 이미 그 트랜잭션이 완료되었더라도 rollback이 수행된다.


 데이터

[Vector]

 Transaction A

 Transaction B

 (100, 100)

 x값을 가지고 와서 20을 더한다.. (100+20)

 

 (120, 100)

 x값을 저장한다. (120) 

 (120, 100)

 

 x값을 가지고 온다. (120)

 (240, 100)

 

 가지고 온 값에 2를 곱한다. (240)

 (240, 100)

 

 연산 결과를 저장한다. (240)

 (240, 100)

 y값을 가지고 온다. (100)

 

 ?

 장애로 인해 rollback

 이미 완료 되었지만 rollback 된다.

* 잘은 모르겠지만 Transaction B의 rollback이 Transaction A보다 늦을경우 rollback결과가 (120, 100)이 되지 않을까?






미완료 의존성(Uncommitted Dependency)

한 트랜잭션이 수행 중 장애가 생겨 rollback 연산을 하기 전에 해당 트랜잭션이 갱신한 데이터를 다른 트랜잭션에서 이미 가져갔다면 데이터베이스에 있는 데이터와 트랜잭션이 가지고 있는 데이터가 다르게 되는 문제가 발생한다.


 데이터 

[Number]

 Transaction A

 Transaction B

 100

 값을 가지고 와서 10을 더한다. (100+10)

 

 110

 연산 결과를 저장한다. (110)

 

 110

 

 데이터를 가지고 온다. (110)

 100

 장애로 인해 rollback

 

* Transaction A가 rollback되면서 데이터베이스의 Number는 100이 되었지만,

Transaction B가 가지고 있는 값은 여전히 110이어서 문제가 생긴다.









병행 제어


여러 트랜잭션이 병행 수행 되며 서로 다른 데이터에 접근하지 않고, 같은 데이터에 접근한다면 데이터에 문제가 생길 수 있다. 이를 방지하기 위해 같은 데이터에 접근하더라도 문제가 생기지 않도록 제어하는 것을 말한다. 운영체제가 멀티 프로세스 또는 멀티 스레드로 프로그램을 실행할 때 임계구역을 설정하는 것과 비슷한 모양이다.

* 실제로 운영체제의 세마포어(Semaphore)와 비슷한 형태의 락 기법을 사용하더라.




댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함