DB Lock
한개의 DB Server 에서 여러 session 이 동시에 접근한 상태에서 session1 과 session2 가 동시에 같은 데이터를 수정하게 되면 트랜잭션의 원자성을 위배하는 현상이 발생한다. 또한, session1 이 작업을 하는 중간에 Rollback 을 수행하게 되면 session2 는 그것을 알지 못하고 잘못된 데이터를 계속해서 수정하는 문제가 발생할 수 있다.
이러한 문제를 방지하기위해 session 이 트랜잭션을 시작하고 데이터를 수정하는 동안 commit 이나 rollback 전까지 다른 session 에서 데이터를 수정할 수 없도록 막아야 한다.
위 그림을 보면 session1 과 session2 에서 트랜잭션을 동시에 실행하여 money 컬럼의 데이터를 변경하려고 접근하고 있다. session1 에서 먼저 데이터를 1500 으로 변경한뒤에 session2 에서 2100 으로 변경하게 되면 session1 에서는 원하는 데이터를 얻지 못하고 session2 에서 계속해서 수정하는 데이터의 결과를 받게 된다. 이러한 현상을 방지하기 위해 그림처럼 session1 에서 DB lock 을 설정하여 다른 세션에서 현재 작업중인 데이터베이스의 데이터를 수정하지 못하게 막을 수 있다.
DB lock 설정 방법 (MySql)
위와 같이 session1 에서 데이터베이스의 DB lock Timeout 를 설정한뒤 update 쿼리를 수행하면 데이터에 잠금이 설정된다. 이 때 session1 은 60sec 동안의 DB lock 을 얻게 되는 것이다 (다른 session 에서 수정 불가)
session2 에서 동일한 데이터를 업데이트하려고 시도하면 session1 에서 해당 데이터의 잠금을 60초동안 잡고 있어서 session2 는 대기 상태에 들어간다.
위와 같이 session2에서 update 쿼리를 수행하였으나 session1에서 설정한 DB lock 을 해제하지 않았기 때문에 session2 에서 수행한 쿼리는 대기상태에 있다가 최종 쿼리에 반영되지 않고 DB server 와의 연결이 해제 된다.
즉, session1에서 특정 데이터의 timeout 을 설정하면 해당 시간동안 다른 세션에서는 session1이 작업한 데이터에 접근할 수 없도록 대기상태로 만들기 때문에 여러 session 에서 데이터를 수정하고 추가하는 과정에서 안정성을 확보하고 DB 의 원자성을 확보할 수 있게 된다.
session1에서 lock 을 반납할 때에는 commit 이나 rollback 을 수행하면 된다.