本文主要梳理一下,PostgreSQL-ArcSDE地理数据库锁,锁的类型、锁的模式、以及地理数据库锁的管理。
锁机制的目的:确保数据库对象的完整性。例如:例如角色1在编辑、查询某一表中的数据时,如果角色2 此时对表的结构进行修改。那么就会发生冲突,对数据的完整性产生影响。如果角色1在编辑、查询数据时,对此表产生一个锁,防止其它角色对表结构进行修改,那么就会解决上述冲突。
锁模式:
地理数据库锁始终处于以下两种不同模式之一:共享锁模式或排它锁模式。
- 共享锁
ArcGIS 会自动获取使用中的单个数据集上的共享锁,例如,当用户编辑或查询要素类或表的内容时。使用该机制可以使其他用户无法对使用中的基础数据集及其方案进行更改。可以在任何时间对单个要素类或表建立任何数量的共享锁。
- 排它锁
排它锁用于锁定地理数据库中的数据集以防止其他用户使用,以便对数据集进行必要的更改,例如,协调版本。当具有适当权限的用户开始更改地理数据库中的数据集时,ArcGIS 会自动在单个属性表、要素类表、栅格表或其他数据集上建立排它锁。但是,如果该数据集上有共享锁,则无法建立排它锁。
排它锁升级自共享锁,当不再需要时降级回共享锁。一个数据集或版本上同一时间只允许有一个排它锁。
锁类型:
地理数据库中有三种不同类型的锁:方案锁、状态锁和版本锁。
- 方案锁
任何时候在 ArcGIS 中打开数据集时都会获得共享方案锁。当以任何方式修改数据集的方案时,共享方案锁将在方案更改期间从共享锁升级为排它锁。这可以防止其他用户打开数据集时更改数据集的方案,从而在多用户环境下提供一致性。
数据所有者可以查看对其数据所施加的方案锁。地理数据库管理员可以在地理数据库管理对话框的锁选项卡中查看所有方案锁。
- 状态锁
任何时候在 ArcGIS 中打开数据集的版本表示时都会获得共享状态锁。
只有地理数据库管理员可以在地理数据库管理对话框的锁选项卡中查看状态锁。
- 版本锁
当启动针对给定版本的编辑会话时将获得共享版本锁。当某个版本与目标版本协调时,共享版本锁会在协调操作期间升级为排它锁。如果两个用户正在编辑同一个版本,则他们都对该版本保持共享锁。两个用户都无法与目标版本协调(需要排它锁),直到其中一个用户停止编辑,从而释放其对该版本的共享锁为止。
只有地理数据库管理员可以在地理数据库管理对话框的锁选项卡中查看版本锁。
锁管理
当前用户可以管理那些锁,取决于当前用户的角色。
数据集(schema拥有者)和版本拥有者角色可以查看与其拥有的空间数据库对象相对应的锁。
地理数据库管理(一般指超级用户),可以查看所有锁,并断开持有锁的用户连接,强制终止锁。
- 锁运行机制,以空间表table1为例:
终端1,查询table1时,那么会创建一条锁记录:【锁模式为:“共享锁”,锁类型为:“方案”】
终端2,也查询tabel1时,会再次创建一条锁记录:【锁模式为:“共享锁”,锁类型为:“方案”】
终端3,也查询table1,不过查看的是表table1的某一个版本,会再次创建一条锁记录:【锁模式为:“共享锁”,锁类型为:“状态”】
终端4,对table1表的某一个版本开启编辑,此时会创建一条锁记录:【锁模式为:“共享锁”,锁类型为:“版本”】
终端5:想对表table1的结构进行调整(增加或拆除字段),如果针对表table1前面四个终端的锁定情况存在,那么会报错“”。除非表table1的上面四种情况的锁都已经释放,才可对table1的结构进行调整。此时会创建一条所记录:【锁模式为:“排它锁”,锁类型为:“方案”】
注:一个数据集或版本上同一时间只允许有一个排它锁。如果整个锁定机制没有出错,关闭目标对象的所有数据库连接,目标对象的数据库锁都会自动解除。
强制解锁的两种方法
- 方法一:使用ArcMap或ArcCatalog
以管理员角色(账户)Sde连接PostgreSQL SDE数据库,在目标数据库连接中点右键,打开【管理地理数据库】对话框。
在打开的对话框中,切换到【锁定】,可以查看当前数据库锁,以及在锁列表中通过点击右键进行锁用户的查询,以及强制解锁(断开用户)
警示:强制解锁会断开加锁定对应用户的数据库会话,最好提前通知相关用户,提前完成相关事务并断开连接(停止Arcgis Server对应动态服务等)。
方法二:直接操作相关数据库原始表
SQL> select * from sde.state_locks;
SQL> select * from sde.object_locks;
SQL> select * from sde.layer_locks;
SQL> select * from sde.table_locks;
手工删除这些表中对应锁定对象的记录。不会对现有服务产生影响,现有的服务都还可以使用。不建议采用这种方式解锁,很容易打乱ArcSDE本省维护的逻辑
提醒:
【连接】标签页的内容存储在sde_process_information中,主要维护当前数据库连接信息是对PostgreSQL数据库连接的ArcGIS补充,实际PostgreSQL数据连接会话和相关机制在PostgreSQL自己维护和监控,在此只删除影响数据库的链接,只会打乱ArcSDE的维护逻辑。但通过ArcMap或ArcCatalog在数据库管理对话框的【连接】标签页,操作【断开连接】在删除这个表中的记录的同时,也会彻底关闭PostgreSQL数据库中的对应连接。