3.9.12. 悲观锁

当同时编辑单个实体实例的机率很高的情况下,应使用悲观锁。在这种情况下,基于实体版本控制的标准乐观锁通常会产生很多冲突。

悲观锁在编辑界面中打开实体实例时显式地锁定实体实例。这样,在同一时刻只有一个用户可以编辑这个实体实例。

悲观锁机制也可用于管理其它任何任务的并发处理,它提供的关键的好处在于锁是分布式的,这是因为锁会在中间件集群中进行复制。JavaDocs 中提供了更多有关 LockManagerAPILockService 接口的详细信息。

可以使用 Administration > Locks > Setup 界面在应用程序开发或生产环境为任何实体类启用悲观锁,或者进行如下操作:

  • SYS_LOCK_CONFIG 表中插入一条包含以下字段值的新记录:

    • ID – 任意 UUID 类型的标识符。

    • NAME – 要锁定的对象的名称。对于实体,应该是其元类的名称。

    • TIMEOUT_SEC – 以秒为单位的锁定超时时间。

    例如:

    insert into sys_lock_config (id, create_ts, name, timeout_sec) values (newid(), current_timestamp, 'sales$Order', 300)
  • 重启应用程序服务或调用 app-core.cuba:type=LockManager JMX bean 的 reloadConfiguration() 方法。

可以通过 app-core.cuba:type=LockManager JMX bean 或通过 Administration > Locks 界面跟踪当前的锁状态。此界面还可以对任何对象进行解锁。