首頁  >  問答  >  主體

java - get_lock(str,timeout)函数使用。

在DB层面实现分布式锁的方法有:利用MySQL的内置函数 get_lock(key, timeout)来实现,这个函数的约定在指定时间内持有锁,它锁的是一行中的某一个字段么?还是锁的是一行?具体项目中是如何使用的?查了一些资料,大概是先约定同一个key,然后先执行get_lock(key,timeout)的,会持有锁,其他的sql只能等待;除非当前的线程释放锁release(key),但是它是如何在项目中控制锁的粒度呢?最好有实例能详解一下。谢谢~~

怪我咯怪我咯2764 天前415

全部回覆(1)我來回復

  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:45:21

    這個鎖是應用程式級別的,在不同的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)。總之,拿不拿鎖是應用程式來決定的,資料庫只是提供這個機制。看大家是否搶同一把鎖,也是純粹看第一個參數鎖名字這個字串一樣不一樣,所以最佳實踐是在鎖名字前面加上表名和資料庫名,以免誤傷

    回覆
    0
  • 取消回覆