## 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