## Pessimistic Lock - 비관적 락 - 항상 트랜잭션 간의 충돌이 일어날 수 있다고 가정하고 우선 락을 걸고 보는 방법. ### 레일즈에서 사용 - `lock!`과 `with_lock` 메서드가 있다. ```rb # 필요할 떄 락을 거려면 lock! 을 사용하면 된다. User.transaction do user = User.find(1) user.lock! user.name = 'kim' user.save! end # 트랜잭션을 시작하기 전에 락을 거려면 with_lock 을 사용하면 된다. user = User.find(1) user.with_lock do user.name = 'kim' user.save! end ``` ## Optimistic lock - 긍정적 락 - update나 delete를 할 때 해당 row의 버전이 다르면 에러를 발생시키는 방법 ### 레일즈에서 사용 - `lock_version` 이라는 컬럼을 추가하면 레일즈가 알아서 Optimistic Lock을 걸어준다. - 만약 버전이 다른 경우 `ActiveRecord::StableObjectError`를 발생시킨다. ```rb user1 = User.find(1) user2 = User.find(1) user1.name = 'kim' save! user2.name = 'lee' save! # Raise an ActiveRecord::StableObjectError ``` - `lock_version` 대신 다른 컬럼 아름을 사용하고 싶으면 `self.locking_column` 으로 지정할 수 있다. ```rb class User < ActiveRecord::Base self.locking_column = :lock_user end ``` #db #lock