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

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

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

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

낙관적 동시제어의 특징

* 트랜잭션을 수행하는 동안 그 트랜잭션을 위해 유지되는 데이터 항목들의 지역 사본에 대해서만 갱신
* 트랜잭션 종료 시에 동시성을 위한 트랜잭션 직렬화가 검증되면 일시에 DB로 반영
* 데이터 자원에 대한 경합이 빈번할 경우 트랜잭션을 반복적으로 다시 시작하는 비용은 성능을 크게 해침. 따라서 경합이 적을 때 주로 쓰임.

### **Rails에서의 낙관적 동시제어**

&#x20;Rails에서는 아래 세 가지를 과정만 거치면 간단하게 낙관적 동시제어를 구현할 수 있다. 이건 [Rails 공식문서](https://api.rubyonrails.org/classes/ActiveRecord/Locking/Optimistic.html)에서도 추천하는 방식이다.

1. update하는 데이터 모델에 \`lock\_version\`을 field로 추가한다..
2. form view에 \`<%= form.hidden\_field :lock\_version %>\` 을 추가한다.
3. controller에 정의되어있는 Strong Parameter에서 \`:lock\_version\`도 permit하도록 수정한다.

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