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()。
命名空間中沒有鎖是沒有錯誤的。
總結
以上是生活随笔為你收集整理的mysql udf limit_锁定服务UDF接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 京东方是做什么的
- 下一篇: 货拉拉能带人吗 货运和客运分开不能接纳客