-
query builder Pessimistic Locking백엔드/laravel 2024. 1. 14. 18:21
pessimistic locking 방식은 여러 사용자가 동시에 동일한 자원에 접근 및 수정할 때 충돌을 방지하기 위한 중요한 기능입니다. 데이터의 일관성과 정확성을 보장하며 다중 사용자가 액세스할 때도 안전하게 작동합니다.
1. lockForUpdate 메서드
DB::transaction(function () {
// 사용자 1의 잔액을 감소시키는 쿼리
DB::table('users')->where('id', 1)->lockForUpdate()->decrement('balance', 20);
// 사용자 2의 잔액을 증가시키는 쿼리
DB::table('users')->where('id', 2)->lockForUpdate()->increment('balance', 20);
});2. sharedLock 메서드
DB::transaction(function () {
// 사용자 1의 잔액을 감소시키는 쿼리 (Shared Lock)
DB::table('users')->where('id', 1)->sharedLock()->decrement('balance', 20);
// 사용자 2의 잔액을 증가시키는 쿼리 (Shared Lock)
DB::table('users')->where('id', 2)->sharedLock()->increment('balance', 20);
});lockForUpdate와 sharedLock의 중요한 차이점은 다음과 같습니다:
- 잠금 유형:
- lockForUpdate: 배타적 잠금(exclusive lock)을 생성합니다. 다른 트랜잭션에서는 동시에 읽기또는 쓰기 작업이 불가능합니다. 해당 레코드를 수정하려는 트랜잭션이 완료될 때까지 대기해야 합니다.
- sharedLock: 공유 잠금(shared lock)을 생성합니다. 다른 트랜잭션에서도 동시에 읽기는 가능하지만, 쓰기 작업은 불가능합니다. 해당 레코드를 수정하려는 트랜잭션이 완료될 때까지 다른 트랜잭션에서 읽기 작업을 수행할 수 있습니다.
- 충돌 여부:
- lockForUpdate: 배타적 잠금을 사용하기 때문에 다른 트랜잭션이 동시에 해당 레코드를 수정하거나 읽는 것이 불가능합니다. 이는 다른 트랜잭션이 해당 레코드를 기다려야 한다는 것을 의미합니다.
- sharedLock: 공유 잠금을 사용하므로 여러 트랜잭션이 동시에 읽기 작업을 수행할 수 있습니다. 다만, 다른 트랜잭션이 쓰기 작업을 수행하려고 할 때에는 대기해야 합니다.
- 성능 및 동시성:
- lockForUpdate: 성능 면에서는 다른 트랜잭션이 대기해야 하기 때문에 동시성이 낮을 수 있습니다. 쓰기 작업이 끝날 때까지 다른 트랜잭션들이 대기해야 하므로 성능 저하가 발생할 수 있습니다.
- sharedLock: 읽기 작업은 동시에 수행할 수 있기 때문에 일반적으로 동시성이 향상됩니다. 하지만 쓰기 작업을 수행하려는 경우에는 대기해야 하므로 동시성이 감소할 수 있습니다.
'백엔드 > laravel' 카테고리의 다른 글
query builder big data set 작업시 지연 로드 lazy 와 lazyById 메서드 (5) 2024.01.14 query builder big data set 분할 처리하는 chunk 메서드 (1) 2024.01.14 query builder transaction (0) 2024.01.14 Query Builder 에서 제공하는 dd 및 dump (0) 2024.01.14 query builder 에서 사용되는 whereBetween 및 whereNotBetween (0) 2024.01.14 - 잠금 유형: