mysql udf limit_锁定服务UDF接口
鎖定服務UDF接口
本節(jié)介紹如何使用鎖定服務用戶定義功能(UDF)接口。要改為使用C語言接口,請參見“鎖定服務C接口”。有關(guān)鎖定服務接口的一般特征,請參見“鎖定服務”。有關(guān)用戶定義函數(shù)的一般信息,請參見“添加用戶定義的功能”。
安裝或卸載UDF鎖定接口
不需要安裝“ Locking Service C接口”中描述的鎖定服務例程,因為它們已內(nèi)置在服務器中。對于映射到對服務例程的調(diào)用的用戶定義函數(shù)(UDF),情況并非如此:必須在使用前安裝UDF。本節(jié)介紹如何執(zhí)行此操作。有關(guān)UDF安裝的一般信息,請參見“添加用戶定義的功能”。
鎖定服務UDF在由plugin_dir系統(tǒng)變量命名的目錄中的插件庫文件中實現(xiàn)。文件的基本名稱為locking_service。每個平臺的文件名后綴都不同(例如,.so對于Unix和類似Unix的系統(tǒng),.dll對于Windows)。
要安裝鎖定服務UDF,請使用以下CREATE FUNCTION語句(.so根據(jù)需要調(diào)整平臺的后綴):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將保持安裝狀態(tài)直到被卸載。要刪除它們,請使用以下DROP FUNCTION語句:DROP FUNCTION service_get_read_locks;
DROP FUNCTION service_get_write_locks;
DROP FUNCTION service_release_locks;
使用UDF鎖定界面
在使用鎖定服務UDF之前,請根據(jù)“安裝或卸載UDF鎖定接口”中提供的說明進行安裝。
要獲取一個或多個讀鎖,請調(diào)用此函數(shù):mysql> SELECT service_get_read_locks('mynamespace', 'rlock1', 'rlock2', 10);
+---------------------------------------------------------------+
| service_get_read_locks('mynamespace', 'rlock1', 'rlock2', 10)|
+---------------------------------------------------------------+
| 1|
+---------------------------------------------------------------+
第一個參數(shù)是鎖名稱空間。最后一個參數(shù)是整數(shù)超時,表示放棄之前要等待多少秒才能獲取鎖。兩者之間的參數(shù)是鎖名稱。
對于剛剛顯示的示例,該函數(shù)獲取具有鎖標識符(mynamespace, rlock1)和的鎖(mynamespace, rlock2)。
要獲取寫鎖而不是讀鎖,請調(diào)用此函數(shù):mysql> SELECT service_get_write_locks('mynamespace', 'wlock1', 'wlock2', 10);
+----------------------------------------------------------------+
| service_get_write_locks('mynamespace', 'wlock1', 'wlock2', 10)|
+----------------------------------------------------------------+
| 1|
+----------------------------------------------------------------+
在這種情況下,鎖定標識符為(mynamespace, wlock1)和(mynamespace, wlock2)。
要釋放名稱空間的所有鎖,請使用以下函數(shù):mysql> SELECT service_release_locks('mynamespace');
+--------------------------------------+
| service_release_locks('mynamespace')|
+--------------------------------------+
| 1|
+--------------------------------------+
每個鎖定函數(shù)返回非零值即可成功。如果功能失敗,則會發(fā)生錯誤。例如,發(fā)生以下錯誤,因為鎖名不能為空:mysql> SELECT service_get_read_locks('mynamespace', '', 10);
ERROR 3131 (42000): Incorrect locking service lock name ''.
會話可以為同一鎖標識符獲取多個鎖。只要其他會話沒有標識符的寫鎖,該會話就可以獲取任意數(shù)量的讀或?qū)戞i。對標識符的每個鎖定請求都獲得一個新的鎖定。以下語句獲取具有相同標識符的三個寫鎖,然后為相同標識符獲取三個讀鎖:SELECT service_get_write_locks('ns', 'lock1', 'lock1', 'lock1', 0);
SELECT service_get_read_locks('ns', 'lock1', 'lock1', 'lock1', 0);
如果此時檢查性能模式metadata_locks表,您將發(fā)現(xiàn)該會話擁有六個具有相同(ns, lock1)標識符的不同鎖。(有關(guān)詳細信息,請參見“鎖定服務監(jiān)視”。)
因為該會話至少持有一個寫鎖(ns, lock1),所以其他任何會話都無法為其獲取鎖,無論是讀還是寫。如果該會話僅持有該標識符的讀鎖,則其他會話可以為其獲取讀鎖,但不獲取寫鎖。
單個鎖獲取調(diào)用的鎖是原子獲取的,但原子性在兩次調(diào)用之間不成立。因此,對于以下語句service_get_write_locks()(在結(jié)果集的每一行中調(diào)用一次)而言,原子性對于每個單獨的調(diào)用均有效,但對于整個語句而言不成立: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;
這些類型的聲明可能會產(chǎn)生某些不利影響。例如,如果該語句在執(zhí)行過程中部分失敗并回滾,則直到失敗點為止獲取的鎖仍將存在。如果意圖是在插入的行和獲取的鎖之間存在對應關(guān)系,則將無法滿足該意圖。同樣,如果以一定順序授予鎖很重要,請注意結(jié)果集順序可能會有所不同,具體取決于優(yōu)化器選擇的執(zhí)行計劃。由于這些原因,最好將應用程序限制為每個語句只能進行一次鎖定獲取調(diào)用。
鎖定服務監(jiān)控
鎖定服務是使用MySQL Server元數(shù)據(jù)鎖定框架實現(xiàn)的,因此您可以通過檢查“性能模式”metadata_locks表來監(jiān)視獲取或等待的鎖定服務鎖定。
首先,啟用元數(shù)據(jù)鎖定工具:mysql> UPDATE performance_schema.setup_instruments SET ENABLED = 'YES'
-> WHERE NAME = 'wait/lock/metadata/sql/mdl';
然后獲取一些鎖并檢查metadata_locks表的內(nèi)容: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(),這與使用函數(shù)獲得的具有的鎖OBJECT_TYPE不同USER LEVEL LOCK。
鎖命名空間,名稱和模式出現(xiàn)在OBJECT_SCHEMA,OBJECT_NAME和LOCK_TYPE列。讀和寫鎖的LOCK_TYPE值分別為SHARED和EXCLUSIVE。
該LOCK_STATUS值GRANTED用于獲取的鎖,PENDING對于正在等待的鎖。您將看到PENDING一個會話是否持有寫鎖,而另一會話是否正在嘗試獲取具有相同標識符的鎖。
鎖定服務UDF接口參考
鎖定服務的SQL接口實現(xiàn)了本節(jié)中描述的用戶定義功能。有關(guān)用法示例,
這些功能具有以下特征:成功返回值非零。否則,將發(fā)生錯誤。
命名空間和鎖名稱必須為非NULL,非空,并且最大長度為64個字符。
超時值必須是整數(shù),表示放棄錯誤之前要等待多少秒才能獲取鎖。如果超時為0,則沒有等待,如果無法立即獲取鎖,該函數(shù)將產(chǎn)生錯誤。
這些鎖定服務UDF可用:service_get_read_locks(namespace,lock_name[,lock_name]...,timeout)
使用給定的鎖名獲取給定名稱空間中的一個或多個讀取(共享)鎖,如果未在給定的超時值內(nèi)獲取鎖,則超時并出錯。
service_get_write_locks(namespace,lock_name[,lock_name]...,timeout)
使用給定的鎖名獲取給定名稱空間中的一個或多個寫(獨占)鎖,如果未在給定的超時值內(nèi)獲取鎖,則超時并出錯。
service_release_locks(namespace)
對于給定的名稱空間,使用service_get_read_locks()和釋放在當前會話中獲取的所有鎖service_get_write_locks()。
命名空間中沒有鎖是沒有錯誤的。
總結(jié)
以上是生活随笔為你收集整理的mysql udf limit_锁定服务UDF接口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 京东方是做什么的
- 下一篇: oracle 中文查询不到,使用PLSQ