锁函数依赖全局锁服务,该服务默认部署在http://localhost:9066/lockserivce,即用于mycat监控的 http 服务内,
所以默认上,锁是基于 mycat 实例级别的,不跨多个 mycat 实例。
锁函数调用
SELECT GET_LOCK('1',0);//锁字符串,锁超时时间
SELECT RELEASE_LOCK('1');//释放锁
SELECT IS_FREE_LOCK('1');//锁是否没有被占用
这三个函数与 mysql 的实现不同,它没有 null 值,null 值被合并到0返回值,null 值在 mysql 语义上是异常或者没有这个锁。
当锁函数被调用的时候,mycat 会调用 http 全局锁服务
构造 post 请求
RequestBody body = new FormBody.Builder()
.add("method", method)
.add("name", name)
.add("timeout", String.valueOf(timeout))
.add("id",String.valueOf(getContext().getSessionId()))
.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 属性
"lock_service_address":"http://localhost:9066/lockserivce"