• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 锁定服务C接口

    MySQL发行版提供了一个锁定界面,该界面有两个级别可用:

    • 作为C语言接口,可以从服务器插件或用户定义函数作为插件服务调用
    • 在SQL级别,作为一组用户定义的函数,这些函数映射到对服务例程的调用

    有关插件服务的一般信息,请参见“插件的MySQL服务”。有关用户定义函数的一般信息,请参见“添加用户定义的功能”。

    锁定接口具有以下特征:

    • 锁具有三个属性:锁命名空间,锁名称和锁模式:

      • 锁由名称空间和锁名称的组合来标识。命名空间使不同的应用程序可以使用相同的锁名,而不会在单独的命名空间中创建锁而导致冲突。例如,如果应用程序A和B使用的名称空间ns1ns2,分别,每个应用可以使用锁的名称lock1lock2不与其它应用干扰。
      • 锁定模式为读或写。共享读取锁:如果会话在给定的锁标识符上具有读取锁,则其他会话可以在同一标识符上获取读锁。写锁是排他的:如果会话在给定的锁标识符上具有写锁,则其他会话无法在同一标识符上获取读或写锁。
    • 命名空间和锁名称必须为非NULL,非空,并且最大长度为64个字符。指定为的名称空间或锁名称NULL,空字符串或长度超过64个字符的字符串会导致ER_LOCKING_SERVICE_WRONG_NAME错误。
    • 锁定接口将名称空间和锁定名称视为二进制字符串,因此比较区分大小写。
    • 锁定接口提供获取锁定和释放锁定的功能。调用这些函数不需要特殊特权。特权检查是调用应用程序的责任。
    • 如果没有立即可用,可以等待锁。锁获取调用采用整数超时值,该值指示放弃之前要等待多少秒来获取锁。如果未成功获取锁而达到超时,ER_LOCKING_SERVICE_TIMEOUT则会发生错误。如果超时为0,则没有等待,如果无法立即获取锁,则调用将产生错误。
    • 锁定接口检测不同会话中的锁定获取调用之间的死锁。在这种情况下,锁定服务会选择一个调用方,并以ER_LOCKING_SERVICE_DEADLOCK错误终止其锁定获取请求。此错误不会导致事务回滚。要选择发生死锁的会话,锁定服务将优先选择持有读锁定的会话而不是持有写锁定的会话。
    • 一个会话可以通过单个锁获取调用来获取多个锁。对于给定的呼叫,锁获取是原子的:如果获取了所有锁,则该呼叫成功。如果获取任何锁均失败,则该调用将不获取锁并失败,通常会带有ER_LOCKING_SERVICE_TIMEOUTER_LOCKING_SERVICE_DEADLOCK错误。
    • 会话可以为同一锁标识符(名称空间和锁名称组合)获取多个锁。这些锁实例可以是读锁,写锁或两者的混合。
    • 会话中获取的锁通过调用释放锁函数显式释放,或者在会话终止时(正常或异常)隐式释放。事务提交或回滚时不会释放锁。
    • 在会话中,给定名称空间的所有锁在释放时都会一起释放。

    锁定服务提供的接口不同于GET_LOCK()SQL函数和相关的SQL函数提供的接口(请参见“锁定函数”)。例如,GET_LOCK()不实现名称空间,仅提供排他锁,不提供不同的读写锁。

    锁定服务C接口

    本节介绍如何使用锁定服务C语言接口。要改用UDF接口,请参见“锁定服务UDF接口”。有关锁定服务接口的一般特征,请参见“锁定服务”。有关插件服务的一般信息,请参见“插件的MySQL服务”。

    使用锁定服务的源文件应包括以下头文件:

    #include <mysql/service_locking.h>
    

    要获取一个或多个锁,请调用此函数:

    int mysql_acquire_locking_service_locks(MYSQL_THD opaque_thd,
                                            const char* lock_namespace,
                                            const char**lock_names,
                                            size_t lock_num,
                                            enum enum_locking_service_lock_type lock_type,
                                            unsigned long lock_timeout);
    

    这些参数具有以下含义:

    • opaque_thd:线程句柄。如果指定为NULL,则使用当前线程的句柄。
    • lock_namespace:以空值结尾的字符串,指示锁定名称空间。
    • lock_names:一个以空字符结尾的字符串数组,提供要获取的锁的名称。
    • lock_numlock_names数组中名称的数量。
    • lock_type:锁定模式,分别为LOCKING_SERVICE_READLOCKING_SERVICE_WRITE获取读取锁定或写入锁定。
    • lock_timeout:放弃前等待获取锁的整数秒数。

    要释放为给定名称空间获取的锁,请调用此函数:

    int mysql_release_locking_service_locks(MYSQL_THD opaque_thd,
                                            const char* lock_namespace);
    

    这些参数具有以下含义:

    • opaque_thd:线程句柄。如果指定为NULL,则使用当前线程的句柄。
    • lock_namespace:以空值结尾的字符串,指示锁定名称空间。

    可以使用性能模式在SQL级别上监视锁定服务获取或等待的锁定。有关详细信息,请参见“锁定服务监视”。