锁函数依赖全局锁服务,该服务默认部署在http://localhost:9066/lockserivce,即用于mycat监控的 http 服务内,
所以默认上,锁是基于 mycat 实例级别的,不跨多个 mycat 实例。

锁函数调用

  1. SELECT GET_LOCK('1',0);//锁字符串,锁超时时间
  2. SELECT RELEASE_LOCK('1');//释放锁
  3. SELECT IS_FREE_LOCK('1');//锁是否没有被占用

这三个函数与 mysql 的实现不同,它没有 null 值,null 值被合并到0返回值,null 值在 mysql 语义上是异常或者没有这个锁。

当锁函数被调用的时候,mycat 会调用 http 全局锁服务
构造 post 请求

  1. RequestBody body = new FormBody.Builder()
  2. .add("method", method)
  3. .add("name", name)
  4. .add("timeout", String.valueOf(timeout))
  5. .add("id",String.valueOf(getContext().getSessionId()))
  6. .build();

method :可能值GET_LOCK,RELEASE_LOCK,IS_FREE_LOCK
timeout :GET_LOCK 的参数
name :锁的名字
id :mycat会话中的 id

当服务返回的响应文本带有1的时候,则SQL函数返回1,
当服务返回的响应文本带有0的时候,则SQL函数返回0

mycat 提供的锁服务,超时参数不会生效,没法获得锁会马上返回值

锁服务更改

设置 server.json 中的 properties 属性

  1. "lock_service_address":"http://localhost:9066/lockserivce"