记录锁定

当多个用户尝试同时更新一条记录时,数据库锁定模型可以确保来自每个用户的更新都可以作为一个单元成功完成,但是每次更新会覆盖前一次更新。

显式(悲观)锁定模型防止数据更新时发生意外的丢失情况,并在发生多个用户同时更新的情况下控制工作流程。

可以使用两种锁定模型:

乐观锁定

乐观锁定模型允许多个用户同时查看并尝试修改同一条记录,但是会阻止除第一个用户以外的其他所有用户落实更改。用户不会收到其他用户也在尝试更新该记录的通知。

落实记录时才会验证记录更改。如果另一个用户已经成功更新了记录,那么其他同时进行更新的用户尝试提交其并发更新时,会收到通知,表明存在冲突。

缺省情况下,不会锁定在 ClearQuest 客户机应用程序中显示的记录。因此,任何使用单一站点或重复环境的模式设计都应考虑到这个因素。

在用户单击应用按钮时,会通过检查另一个用户是否已经更新记录并落实其更改或是还处于更改过程中,来确保数据的完整性。如果是这样,用户的更新就无法落实到数据库,因为这可能会导致丢失其他用户的某些更改。如果该用户在另一个用户更新记录后尝试落实更改,那么会收到一条错误消息,说明其更改无法落实到数据库。

如果某些复杂情况涉及对多条相关记录进行协调更新,那么必须十分小心,确保这种行为不会导致问题。由于乐观锁定对于每条记录个别有效,因此您的应用程序必须确保记录按照正确的顺序进行更新,如果其他用户在您开始操作之后,落实更改之前更新了记录,那么需要处理失败情况,以便能够更新下级记录。您的模式设计可以重试操作,确认失败并还原父记录的更新,或者可以即使在下级记录更新失败的情况下落实父记录更新。

您的模式设计应该能够处理下列情况:记录是可修改的,
  • 但是由于该记录在修改过程中又由其他用户修改,因此修改失败。
  • 而且下级记录也是可修改的,但是由于该下级记录在修改过程中又由其他用户修改,因此修改失败。

悲观锁定

悲观锁定提供了一种机制,用于防止多个用户同时编辑同一条记录的情况。悲观锁定模型实施按序修改记录的规则,并阻止对记录进行同时更新。 一旦某个用户开始更新记录,该模型就会对该记录加锁。尝试更新该记录的任何其他用户会得到另一用户正在进行更新的通知,并因为该记录被锁定而无法修改。如果多个用户希望同时更新记录,那么必须等到第一个用户完成落实记录后,另一个用户才能获得锁定,并且在上一个用户更改的基础上进行更改。该模型通过防止冲突,避免了解决冲突的问题。更新按顺序执行,每次后续更新都是在上一个用户已更新记录的基础上进行的。

但是,必须获取锁定以防止其他用户更新记录。悲观模型需要能满足下列条件的锁管理策略:
  • 获取锁定
  • 通知想要同时更新记录的任何用户 - 他们必须等到锁定释放后才能进行更新
  • 通知用户 - 锁定已释放
  • 释放已丢弃的锁定(如,由于系统崩溃或用户忘记完成更新)

要使用悲观记录锁定,必须为要使用该锁定的记录类型添加挂钩代码。对于每个记录类型,挂钩代码必须添加为“基本”类型的新操作。可通过作为记录脚本别名实施的挂钩代码手工除去锁定。您可以使用 ClearQuest 查询,通过搜索 locked_by 字段为非空值的记录,来查找被锁定的记录。locked_by 用户数据库列是一个整数列,用于在锁定记录时记录用户的登录标识。

如果不需要真正进行同时更新,并且后续更新可以延迟到上一次更新完成后再进行,那么悲观锁定是一种非常有用的方法。 这通常表示多次更新在非常短的时间间隔内执行。长时间锁定记录的更新会阻止其他用户更新该记录。


反馈