文档

锁函数

更新时间:

PolarDB-X从2.4.0_5.4.19-20240426版本开始,支持MySQL 5.7的所有锁函数,具体情况见下表, 更多信息请参见Locking Functions

函数名

描述

GET_LOCK(str, timeout)

获取一个命名锁,str是锁的名称,timeout是锁的超时时间。返回结果如下:

  • 如果成功获得锁,返回1;

  • 如果尝试超时,返回0;

  • 如果发生错误,返回NULL。

IS_FREE_LOCK(str)

判断命名锁是否空闲,str是锁的名称。

  • 如果锁是空闲的,返回1;

  • 如果锁正在使用,返回0;

  • 如果发生错误,返回NULL。

IS_USED_LOCK(str)

判断命名锁是否被使用,str是锁的名称。如果锁正在被使用,则返回持有锁的客户端会话的连接标识符,否则返回NULL。

RELEASE_LOCK(str)

释放一个命名锁,str是锁的名称。

  • 如果锁被成功释放,返回1;

  • 如果锁不是由这个线程建立的,返回0;

  • 如果命名的锁不存在,返回NULL。

RELEASE_ALL_LOCK()

释放当前会话持有的所有命名锁。返回结果为释放的锁的数量,如果没有释放锁则返回0。

相关函数

PolarDB-X还支持相关函数IS_MY_LOCK(str),判断命名锁是否被当前会话持有,如果当前会话持有该锁,则返回1,否则返回0。

使用建议

如果您的业务场景需要长时间持有锁,为了避免低概率的脑裂分区导致锁失效,建议用户每60s周期内使用IS_MY_LOCK函数定期对锁进行持有判断,使用示例的伪代码如下:

get_lock(lock_name);//获取锁

while(is_my_lock(lock_name)){ //判断锁是否有效
    do_work_with_timeout(60); // 执行业务操作,限时60s
    if(work_finshed){ //判断业务是否执行结束
        break;
    }
}

release_lock(lock_name);//释放锁