亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

get_lock(str,timeout)函數使用。

get_lock(str,timeout)函數使用。

躍然一笑 2019-03-29 23:19:29
在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,也是純粹看第一個參數鎖名字這個字符串一樣不一樣,所以最佳實踐是在鎖名字前面加上表名和數據庫名,以免誤傷


查看完整回答
反對 回復 2019-04-23
  • 1 回答
  • 0 關注
  • 575 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號