데이터베이스는 락(Lock)이라는 장치로 데이터에 접근 제약을 두어
데이터 정합성을 맞추는 다양한 방법을 제공한다.
대표적으로,

실제로 테이블 혹은 로우에 락을 걸어서 데이터 접근 제약을 두어 정합성을 맞추는 방법이다
이러한 방식으로 Exclusive Lock을 걸면 다른 트랜잭션에서는 데이터를 가져갈 수 없다.
가장 직관적으로 접근 제약을 둘 수 있지만,
두 개 이상의 스레드가 서로 락을 얻기 위해 무한정 대기하는 데드락에 빠질 수 있다.

실제로 데이터 자체에 락을 두는 것이 아니라 데이터의 버전을 이용하여 정합성을 맞추는 방법이다.
데이터를 읽을 때 데이터의 버전을 함께 조회한다.
그리고 업데이트 하기전에 업데이트 하려는 데이터의 버전이 처음 조회했을 당시 버전과 동일한지 확인한다.

만약 버전이 같다면 업데이트에 성공하고, 버전이 다르다면 업데이트에 실패한다.
이 경우 다시 데이터를 조회해서 업데이트를 재수행 해야한다.
ObjectOptimisticLockingFailureException 예외가 발생