Laravel 事務中 使用 悲觀鎖 小結

LW_aravel發表於2019-11-19

laravel 提供了方便快捷的資料庫事務使用方式,在使用中遇到過幾個容易混淆和被誤導的地方,這裡做個記錄,希望哪裡寫的不對的地方各位大神指點一下
laravel 事務分為手動方式和自動方式,但如果我們在使用 laravel 提供的 sharedLock 或者 lockForUpdate 鎖表的方式,為了避免不必要的麻煩和錯誤,建議最好使用手動提交事務來處理,如下圖:

laravel 事務中 使用 悲觀鎖 小結

下面來說說 sharedLock(共享鎖) 和lockForUpdate(悲觀鎖) 這兩個在使用上的區別和影響

  1. sharedLock(共享鎖)
    sharedLock 使用時等同於SQL語句 select * from transaction_test where type = 1 lock in share mode;
    在事務中使用 sharedLock 時才會生效,會把資料所在行進行鎖定,此時被鎖定的資料,不允許被其他操作修改,但是被鎖定的資料,對查詢操作沒有影響,無論是普通查詢還是事務中的查詢操作,都不會受到影響.被鎖定的資料,直到事務被提交或者回滾之後,才會釋放.

  2. lockForUpdate(悲觀鎖)
    lockForUpdate 使用時等同於SQL語句 select * from transaction_test where type = 1 for update;
    lockForUpdate只有在事務中才會生效,使用lockForUpdate時資料所在行被鎖定,此刻其他事務中的鎖表操作會等待當前事務提交才會執行,但是對於非鎖表和普通的查詢操作並沒有限制,有影響的只是你在事務中同樣執行的鎖表操作.

    總之,無論是共享鎖還是悲觀鎖,受影響的只是事務中執行鎖表的操作,對於普通的查詢操作,和事務中的非鎖表操作沒有影響,
    同時需要注意的是,無論悲觀鎖還是共享鎖當sql語句涉及到索引,並用索引作為查詢或判斷的依據時,那麼mysql會用行級鎖鎖定所要修改的行,否則會使用表鎖鎖住整張表,因此在使用時一定要注意使用索引,否則會導致高的併發問題;

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章