모델 개발 - 낙관적 동시 실행 제어

여러 트랜잭션들이 동시에 실행되면서도 데이터베이스의 일관성을 유지할 수 있게 하는 것을 데이터베이스 병행제어라고 부른다.

낙관적 동시제어(Optimistic concurrency control) 혹은 낙관적 잠금(Optimistic locking)은 이 데이터베이스 병행제어 기법의 일종이다.

낙관적 동시제어는 그 이름에서 유추할 수 있듯, 사용자들이 같은 데이터를 동시에 수정하지 않을 것이라고 '낙관적으로' 가정한다. 때문에 트랜잭션 수행 동안은 어떠한 검사도 하지 않는다. 물론 동시 트랜잭션에 의한 데이터의 잘못된 갱신을 신경쓰지 않는다는 것은 아니다! 낙관적 동시제어는 트랜잭션 종료 시에 일괄적으로 검사하여 데이터의 잘못된 갱신을 막는다.

낙관적 동시제어의 특징

  • 트랜잭션을 수행하는 동안 그 트랜잭션을 위해 유지되는 데이터 항목들의 지역 사본에 대해서만 갱신

  • 트랜잭션 종료 시에 동시성을 위한 트랜잭션 직렬화가 검증되면 일시에 DB로 반영

  • 데이터 자원에 대한 경합이 빈번할 경우 트랜잭션을 반복적으로 다시 시작하는 비용은 성능을 크게 해침. 따라서 경합이 적을 때 주로 쓰임.

Rails에서의 낙관적 동시제어

Rails에서는 아래 세 가지를 과정만 거치면 간단하게 낙관적 동시제어를 구현할 수 있다. 이건 Rails 공식문서에서도 추천하는 방식이다.

  1. update하는 데이터 모델에 `lock_version`을 field로 추가한다..

  2. form view에 `<%= form.hidden_field :lock_version %>` 을 추가한다.

  3. controller에 정의되어있는 Strong Parameter에서 `:lock_version`도 permit하도록 수정한다.

2012년 1월 1일 기준으로Rails 6.1.0버전에서는 위 방법으로 낙관적 동시제어를시도해도 제대로 작동하지 않는다.관련하여 이슈가 보고되었고, 수정되고 있다.(그런 줄도 모르고 난..)

Last updated