本手册下载

8.3带锁工作

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

lockShared ()lockExclusive ()方法具有以下属性,无论它们是与集合或表一起使用。

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

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

  • lockExclusive ()有相同的语义选择……更新。对于搜索遇到的任何索引记录,它将锁定行和任何关联的索引项,方法与发出更新语句。其他事务被阻止更新这些行选择……锁定共享模式,或从某些事务隔离级别读取数据。一致的读取会忽略在读取视图中存在的记录上设置的任何锁。旧版本的记录不能被锁定;通过对记录的内存副本应用撤销日志,可以重构它们。

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

两种锁定方法都支持NOWAIT跳过锁InnoDB锁定模式。有关更多信息,请参见用NOWAIT和SKIP锁定读并发。要使用这些锁定模式和锁定方法,请传入以下其中之一:

  • NOWAIT—如果函数遇到行锁,它会终止并生成一个行锁ER_LOCK_NOWAIT错误

  • SKIP_LOCKED—如果函数遇到行锁,则跳过该行继续执行

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

锁定的考虑

当使用锁定模式工作时,请注意以下事项:

  • 自动提交模式意味着始终有一个事务打开,当SQL语句执行时自动提交该事务。

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

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

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

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