ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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의 중요한 차이점은 다음과 같습니다:

    1. 잠금 유형:
      • lockForUpdate: 배타적 잠금(exclusive lock)을 생성합니다. 다른 트랜잭션에서는 동시에 읽기또는 쓰기 작업이 불가능합니다. 해당 레코드를 수정하려는 트랜잭션이 완료될 때까지 대기해야 합니다.
      • sharedLock: 공유 잠금(shared lock)을 생성합니다. 다른 트랜잭션에서도 동시에 읽기가능하지만, 쓰기 작업은 불가능합니다. 해당 레코드를 수정하려는 트랜잭션이 완료될 때까지 다른 트랜잭션에서 읽기 작업을 수행할 수 있습니다.
    2. 충돌 여부:
      • lockForUpdate: 배타적 잠금을 사용하기 때문에 다른 트랜잭션이 동시에 해당 레코드를 수정하거나 읽는 것이 불가능합니다. 이는 다른 트랜잭션이 해당 레코드를 기다려야 한다는 것을 의미합니다.
      • sharedLock: 공유 잠금을 사용하므로 여러 트랜잭션이 동시에 읽기 작업을 수행할 수 있습니다. 다만, 다른 트랜잭션이 쓰기 작업을 수행하려고 할 때에는 대기해야 합니다.
    3. 성능 및 동시성:
      • lockForUpdate: 성능 면에서는 다른 트랜잭션이 대기해야 하기 때문에 동시성이 낮을 수 있습니다. 쓰기 작업이 끝날 때까지 다른 트랜잭션들이 대기해야 하므로 성능 저하가 발생할 수 있습니다.
      • sharedLock: 읽기 작업은 동시에 수행할 수 있기 때문에 일반적으로 동시성이 향상됩니다. 하지만 쓰기 작업을 수행하려는 경우에는 대기해야 하므로 동시성이 감소할 수 있습니다.

    댓글

Designed by Tistory.