在DB層面實現分布式鎖的方法有:利用MySQL的內置函數 get_lock(key, timeout)來實現,這個函數的約定在指定時間內持有鎖,它鎖的是一行中的某一個字段么?還是鎖的是一行?具體項目中是如何使用的?查了一些資料,大概是先約定同一個key,然后先執行get_lock(key,timeout)的,會持有鎖,其他的sql只能等待;除非當前的線程釋放鎖release(key),但是它是如何在項目中控制鎖的粒度呢?最好有實例能詳解一下。謝謝~~
1 回答
慕碼人8056858
TA貢獻1803條經驗 獲得超6個贊
這個鎖是應用程序級別的,在不同的mysql會話之間使用。它只是個名字鎖,跟你理解的表啊行啊字段啊都沒有直接關系,具體是鎖什么完全交給應用程序。它是一種獨占鎖,意味著哪個會話持有這個鎖,其他會話嘗試拿這個鎖的時候都會失敗。
比如你想鎖一行記錄record A,那么當前會話里你建一個鎖get_lock("record A", 10)。此時其他所有會話依然可以隨便訪問和修改record A,除非他們顯式的也調用get_lock("record A", 10)。
也就是說完全是你的應用程序來決定檢不檢查鎖。你如果想鎖,就讓所有會話在訪問record A的時候都顯式的調用get_lock("record A", 10),那明顯只有一個會話能成功。其他會話只有等超時或者持有鎖的會話調用release_lock后才能重新拿到鎖
同理,你想鎖一個字段column A,那跟上面一樣建一個鎖get_lock("column A", 10)??傊?,拿不拿鎖是應用程序來決定的,數據庫只是提供這個機制??创蠹沂欠駬屚话焰i,也是純粹看第一個參數鎖名字這個字符串一樣不一樣,所以最佳實踐是在鎖名字前面加上表名和數據庫名,以免誤傷
添加回答
舉報
0/150
提交
取消
