X DevAPI 用户指南  / 第 8 章语句执行  /  8.3 使用锁定

8.3 使用锁定

X DevAPI 通过Collection.find() 和 Table.select() 方法的lockShared()和 方法 支持 MySQL 锁定 。lockExclusive()这使您能够控制行锁定以确保对集合进行安全的事务性文档更新并避免并发问题,例如在使用 modify() 方法时。本节介绍如何对 Collection.find() 和 Table.select() 方法使用 lockShared()lockExclusive()方法。有关锁定的更多背景信息,请参阅 锁定读取

lockShared()和 方法具有 以下lockExclusive()属性,无论它们是与 Collection 还是 Table 一起使用。

  • 允许多次调用锁定方法。如果一个锁定语句在另一个事务持有同一个锁时执行,它将阻塞直到另一个事务释放它。如果多次调用锁定方法,则最后调用的锁定方法优先。换句话说 find().lockShared().lockExclusive()相当于find().lockExclusive().

  • lockShared()与 具有相同的语义 SELECT ... LOCK IN SHARE MODE。在读取的任何行上设置共享模式锁。其他会话可以读取这些行,但在您的事务提交之前不能修改它们。如果这些行中的任何一行被另一个尚未提交的事务更改,您的查询将等待该事务结束,然后使用最新的值。

  • lockExclusive()与 具有相同的语义 SELECT ... FOR UPDATE。对于搜索遇到的任何索引记录,它会锁定行和任何关联的索引条目,就像您 UPDATE为这些行发出语句一样。在某些事务隔离级别中,其他事务被阻止更新这些行、执行 SELECT ... LOCK IN SHARE MODE或读取数据。一致读取忽略读取视图中存在的记录上设置的任何锁。无法锁定旧版本的记录;它们是通过在记录的内存副本上应用撤消日志来重建的。

  • 只要获得锁的交易存在,锁就会一直持有。它们会在语句完成后立即释放,除非事务已打开或自动提交模式已关闭。

两种锁定方法都支持NOWAITSKIP LOCKED InnoDB 锁定模式。有关详细信息 ,请参阅使用 NOWAIT 和 SKIP LOCKED 锁定读取并发。要将这些锁定模式与锁定方法一起使用,请传入以下内容之一:

  • NOWAIT- 如果函数遇到行锁,它会中止并产生 ER_LOCK_NOWAIT错误

  • SKIP_LOCKED- 如果函数遇到行锁,它会跳过该行并继续

  • DEFAULT- 如果函数遇到行锁,它会一直等到没有锁为止。相当于在没有模式的情况下调用 lock 方法。

锁定注意事项

使用锁定模式时请注意以下几点:

  • autocommit模式意味着总是有一个事务打开,它在 SQL 语句执行时自动提交。

  • 默认情况下,会话处于自动提交模式。

  • 调用 时隐式禁用自动提交模式 startTransaction()

  • 在自动提交模式下,如果获取了锁,则在语句完成后释放锁。这可能会导致您得出未获取锁的结论,但事实并非如此。

  • 类似地,如果您尝试获取其他人已拥有的锁,语句将阻塞,直到其他锁被释放。