6.21. 长事务支持
该章节以及相关的 pl/pgsql 函数用于提供 Web Feature Service 规范所要求的长事务支持实现。
注意
要想使用该功能,用户必须使用 serializable transaction level 这样的数据库隔离级别,否则锁事务无法实现。
6.21.1. AddAuth
AddAuth — 添加一个用于当前事务的鉴权令牌(authorization token),如果成功返回 true
用法
boolean AddAuth(text auth_token);
描述
添加一个用于当前事务的鉴权令牌(authorization token),如果成功返回 true。
在临时表 temp_lock_have_table 中添加一个当前事务标识和鉴权令牌
样例
SELECT LockRow('towns', '353', 'priscilla'); BEGIN TRANSACTION; SELECT AddAuth('joey'); UPDATE towns SET the_geom = ST_Translate(the_geom,2,2) WHERE gid = 353; COMMIT; ---Error-- ERROR: UPDATE where "gid" = '353' requires authorization 'priscilla'
相关参考
LockRow
6.21.2. CheckAuth
CheckAuth — 基于鉴权令牌(authorization token),在一个表上创建一个阻止或允许更新或删除表记录的触发器。
用法
integer CheckAuth(text a_schema_name, text a_table_name, text a_key_column_name); integer CheckAuth(text a_table_name, text a_key_column_name);
描述
基于鉴权令牌(authorization token),在一个表上创建一个阻止或允许更新或删除表记录的触发器。通过列的 <rowid_col> 方式来标识行。如果没有指定 schema,使用当前 current_schema () 对应的值。
注意
如果该表上面已经有了一个鉴权触发器,函数会返回错误。如果没有开启事务支持,函数会抛出异常。
样例
SELECT CheckAuth('public', 'towns', 'gid'); result ------ 0
相关参考
EnableLongTransactions
6.21.3. DisableLongTransactions
DisableLongTransactions — 关闭长事务支持。该函数会移除对长事务支持所创建的元数据信息表(保存这些空间表的相关信息),并丢掉所有表上面的锁检测的触发器
用法
text DisableLongTransactions();
描述
关闭长事务支持。该函数会移除对长事务支持,并丢掉所有表上面的锁检测的触发器
具体就是该函数会删除元数据表 authorization_table 和视图 authorized_tables 以及触发器 checkauthtrigger
样例
SELECT DisableLongTransactions(); result Long transactions support disabled
相关参考
EnableLongTransactions
6.21.4. EnableLongTransactions
EnableLongTransactions — 开启长事务支持。该函数会创建开启事务支持所必须的元数据表。在使用本章节其他函数(本节的函数都需要事务支持)前需要调用该函数一次,当然再执行一次也没有什么问题。
用法
text EnableLongTransactions();
描述
开启长事务支持。该函数会创建开启事务支持所必须的元数据表。在使用本章节其他函数(本节的函数都需要事务支持)前需要调用该函数一次,当然再执行一次也没有什么问题。
具体就是该函数会创建元数据表 authorization_table 和视图 authorized_tables。
样例
SELECT EnableLongTransactions(); result Long transactions support enabled
相关参考
DisableLongTransactions
6.21.5. LockRow
LockRow — 对于一个表中具体的行加锁或者说加认证。
用法
integer LockRow(text a_schema_name, text a_table_name, text a_row_key, text an_auth_token, timestamp expire_dt); integer LockRow(text a_table_name, text a_row_key, text an_auth_token, timestamp expire_dt); integer LockRow(text a_table_name, text a_row_key, text an_auth_token);
描述
对于一个表中具体的行加锁或者说加认证。参数 expire 默认的过期时间是当前时间的一个小时之后过期。 如果成功返回 1,否则返回 0(表示已经加了锁)。
样例
SELECT LockRow('public', 'towns', '2', 'joey'); LockRow ------- 1 --Joey has already locked the record and Priscilla is out of luck SELECT LockRow('public', 'towns', '2', 'priscilla'); LockRow ------- 0
参考
UnlockRows
6.21.6. UnlockRows
UnlockRows — 根据认证 token,移除所有记录的锁,返回被释放的记录数。
用法
integer UnlockRows(text auth_token);
描述
根据认证 token,移除所有记录的锁,返回被释放的记录数。
样例
SELECT LockRow('towns', '353', 'priscilla'); SELECT LockRow('towns','2', 'priscilla'); SELECT UnLockRows('priscilla'); UnLockRows ------------ 2
相关参考
LockRow