mysql udf limit_锁定服务UDF接口

锁定服务UDF接口

本节介绍如何使用锁定服务用户定义功能(UDF)接口。要改为使用C语言接口,请参见“锁定服务C接口”。有关锁定服务接口的一般特征,请参见“锁定服务”。有关用户定义函数的一般信息,请参见“添加用户定义的功能”。

安装或卸载UDF锁定接口

不需要安装“ Locking Service C接口”中描述的锁定服务例程,因为它们已内置在服务器中。对于映射到对服务例程的调用的用户定义函数(UDF),情况并非如此:必须在使用前安装UDF。本节介绍如何执行此操作。有关UDF安装的一般信息,请参见“添加用户定义的功能”。

锁定服务UDF在由plugin_dir系统变量命名的目录中的插件库文件中实现。文件的基本名称为locking_service。每个平台的文件名后缀都不同(例如,.so对于Unix和类似Unix的系统,.dll对于Windows)。

要安装锁定服务UDF,请使用以下CREATE FUNCTION语句(.so根据需要调整平台的后缀):CREATE FUNCTION service_get_read_locks RETURNS INT

SONAME 'locking_service.so';

CREATE FUNCTION service_get_write_locks RETURNS INT

SONAME 'locking_service.so';

CREATE FUNCTION service_release_locks RETURNS INT

SONAME 'locking_service.so';

如果在主复制服务器上使用了UDF,请在所有从属服务器上也安装它们,以避免复制问题。

一旦安装,UDF将保持安装状态直到被卸载。要删除它们,请使用以下DROP FUNCTION语句:DROP FUNCTION service_get_read_locks;

DROP FUNCTION service_get_write_locks;

DROP FUNCTION service_release_locks;

使用UDF锁定界面

在使用锁定服务UDF之前,请根据“安装或卸载UDF锁定接口”中提供的说明进行安装。

要获取一个或多个读锁,请调用此函数:mysql> SELECT service_get_read_locks('mynamespace', 'rlock1', 'rlock2', 10);

+---------------------------------------------------------------+

| service_get_read_locks('mynamespace', 'rlock1', 'rlock2', 10)|

+---------------------------------------------------------------+

| 1|

+---------------------------------------------------------------+

第一个参数是锁名称空间。最后一个参数是整数超时,表示放弃之前要等待多少秒才能获取锁。两者之间的参数是锁名称。

对于刚刚显示的示例,该函数获取具有锁标识符(mynamespace, rlock1)和的锁(mynamespace, rlock2)。

要获取写锁而不是读锁,请调用此函数:mysql> SELECT service_get_write_locks('mynamespace', 'wlock1', 'wlock2', 10);

+----------------------------------------------------------------+

| service_get_write_locks('mynamespace', 'wlock1', 'wlock2', 10)|

+----------------------------------------------------------------+

| 1|

+----------------------------------------------------------------+

在这种情况下,锁定标识符为(mynamespace, wlock1)和(mynamespace, wlock2)。

要释放名称空间的所有锁,请使用以下函数:mysql> SELECT service_release_locks('mynamespace');

+--------------------------------------+

| service_release_locks('mynamespace')|

+--------------------------------------+

| 1|

+--------------------------------------+

每个锁定函数返回非零值即可成功。如果功能失败,则会发生错误。例如,发生以下错误,因为锁名不能为空:mysql> SELECT service_get_read_locks('mynamespace', '', 10);

ERROR 3131 (42000): Incorrect locking service lock name ''.

会话可以为同一锁标识符获取多个锁。只要其他会话没有标识符的写锁,该会话就可以获取任意数量的读或写锁。对标识符的每个锁定请求都获得一个新的锁定。以下语句获取具有相同标识符的三个写锁,然后为相同标识符获取三个读锁:SELECT service_get_write_locks('ns', 'lock1', 'lock1', 'lock1', 0);

SELECT service_get_read_locks('ns', 'lock1', 'lock1', 'lock1', 0);

如果此时检查性能模式metadata_locks表,您将发现该会话拥有六个具有相同(ns, lock1)标识符的不同锁。(有关详细信息,请参见“锁定服务监视”。)

因为该会话至少持有一个写锁(ns, lock1),所以其他任何会话都无法为其获取锁,无论是读还是写。如果该会话仅持有该标识符的读锁,则其他会话可以为其获取读锁,但不获取写锁。

单个锁获取调用的锁是原子获取的,但原子性在两次调用之间不成立。因此,对于以下语句service_get_write_locks()(在结果集的每一行中调用一次)而言,原子性对于每个单独的调用均有效,但对于整个语句而言不成立:SELECT service_get_write_locks('ns', 'lock1', 'lock2', 0) FROM t1 WHERE ... ;警告

由于锁定服务会针对给定锁标识符的每个成功请求返回单独的锁,因此单个语句就有可能获取大量锁。例如:INSERT INTO ... SELECT service_get_write_locks('ns', t1.col_name, 0) FROM t1;

这些类型的声明可能会产生某些不利影响。例如,如果该语句在执行过程中部分失败并回滚,则直到失败点为止获取的锁仍将存在。如果意图是在插入的行和获取的锁之间存在对应关系,则将无法满足该意图。同样,如果以一定顺序授予锁很重要,请注意结果集顺序可能会有所不同,具体取决于优化器选择的执行计划。由于这些原因,最好将应用程序限制为每个语句只能进行一次锁定获取调用。

锁定服务监控

锁定服务是使用MySQL Server元数据锁定框架实现的,因此您可以通过检查“性能模式”metadata_locks表来监视获取或等待的锁定服务锁定。

首先,启用元数据锁定工具:mysql> UPDATE performance_schema.setup_instruments SET ENABLED = 'YES'

-> WHERE NAME = 'wait/lock/metadata/sql/mdl';

然后获取一些锁并检查metadata_locks表的内容:mysql> SELECT service_get_write_locks('mynamespace', 'lock1', 0);

+----------------------------------------------------+

| service_get_write_locks('mynamespace', 'lock1', 0)|

+----------------------------------------------------+

| 1|

+----------------------------------------------------+

mysql> SELECT service_get_read_locks('mynamespace', 'lock2', 0);

+---------------------------------------------------+

| service_get_read_locks('mynamespace', 'lock2', 0)|

+---------------------------------------------------+

| 1|

+---------------------------------------------------+

mysql> SELECT OBJECT_TYPE, OBJECT_SCHEMA, OBJECT_NAME, LOCK_TYPE, LOCK_STATUS

-> FROM performance_schema.metadata_locks

-> WHERE OBJECT_TYPE = 'LOCKING SERVICE'\G

*************************** 1. row***************************

OBJECT_TYPE: LOCKING SERVICE

OBJECT_SCHEMA: mynamespace

OBJECT_NAME: lock1

LOCK_TYPE: EXCLUSIVE

LOCK_STATUS: GRANTED

*************************** 2. row***************************

OBJECT_TYPE: LOCKING SERVICE

OBJECT_SCHEMA: mynamespace

OBJECT_NAME: lock2

LOCK_TYPE: SHARED

LOCK_STATUS: GRANTED

锁定服务锁的OBJECT_TYPE值为LOCKING SERVICE。例如GET_LOCK(),这与使用函数获得的具有的锁OBJECT_TYPE不同USER LEVEL LOCK。

锁命名空间,名称和模式出现在OBJECT_SCHEMA,OBJECT_NAME和LOCK_TYPE列。读和写锁的LOCK_TYPE值分别为SHARED和EXCLUSIVE。

该LOCK_STATUS值GRANTED用于获取的锁,PENDING对于正在等待的锁。您将看到PENDING一个会话是否持有写锁,而另一会话是否正在尝试获取具有相同标识符的锁。

锁定服务UDF接口参考

锁定服务的SQL接口实现了本节中描述的用户定义功能。有关用法示例,

这些功能具有以下特征:成功返回值非零。否则,将发生错误。

命名空间和锁名称必须为非NULL,非空,并且最大长度为64个字符。

超时值必须是整数,表示放弃错误之前要等待多少秒才能获取锁。如果超时为0,则没有等待,如果无法立即获取锁,该函数将产生错误。

这些锁定服务UDF可用:service_get_read_locks(namespace,lock_name[,lock_name]...,timeout)

使用给定的锁名获取给定名称空间中的一个或多个读取(共享)锁,如果未在给定的超时值内获取锁,则超时并出错。

service_get_write_locks(namespace,lock_name[,lock_name]...,timeout)

使用给定的锁名获取给定名称空间中的一个或多个写(独占)锁,如果未在给定的超时值内获取锁,则超时并出错。

service_release_locks(namespace)

对于给定的名称空间,使用service_get_read_locks()和释放在当前会话中获取的所有锁service_get_write_locks()。

命名空间中没有锁是没有错误的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值