참조 : Wikipedia-Optimistic concurrency control

optimistic concurrency control, (OCC) is a concurrency control method used in relational databases without using locking. It is commonly referred to as optimistic locking, a misnomer.Optimistic concurrency control

Non-lock concurrency control 방법들 중에 하나로 Locking을 사용하지 않고 동시성 제어를 하는 방법을 Optimistic concurrency control 또는 Optimistic locking이라고 합니다.

트랜잭션 충돌이 거의 발생하지 않는다는 가정하에 다음의 절차로 트랜잭션을 처리합니다.

읽기: 클라이언트가 데이타베이스로 부터 값을 읽어서 private sandox 나 cache에 저장하고 클라이언트는 그것을 가지고 작업을 합니다.

검증하기: 클라이언트가 샌드박스나 케쉬에서 편집을 끝내면 그것들을 데이타 베이스에 넣기 전에 검증 작업을 거칩니다.

- backward validation schemes 에 커밋된 트랜잭션이 존재하거나
- forward validation schemes 에 현재 실행중인 트랜잭션이 존재하면

출동이 발생합니다. 충돌이 발생하면 충돌을 풀기 위한 알고리즘이 사용되거나(주로 사용자에 의해 변경된 부분을 최소화 시킵니다.)[footnote]원문에는 ideally by minimizing the number of
changes made by the user 이렇게 적혀 있는데 변경 되는 사항들을 최소화 시킨다는 것이 어떤 건지 모르겠네요. queue로 변경 작업을 하는 트랜잭션을 관리하여 한번에 하나씩 처리하게 한다는 것인가;;??[/footnote] 전체 트랜잭션을 취소(이때는 사용자가 변경한 부분이 모두 날리게 되니까 그다지 좋은 방법은 아닙니다.)시킵니다.

쓰기: 만약 충돌이 발생하지 않았다면 커밋합니다.

충돌이 자주 발생하지 않으면 이 방법으로 다른 방법들(non-lock concurrency control) 보다 많은 작업을 처리할 수 있지만, 충돌이 자주 발생하면 성능이 떨어지기 때문에 충돌이 자주 발생할 때 효율이 좋은 다른 방법을 사용합니다.

사용한 곳

  • MediaWiki's edit pages use OCC. The conflict resolution algorithm is described here.
  • Bugzilla uses OCC; conflicts are called "mid-air collisions". [1]
  • The Ruby on Rails framework has an API for OCC. [2]
  • Most revision control systems support the "merge" model for concurrency, which is OCC.