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 ()
。在自动提交模式下,如果获取了一个锁,则在语句完成后释放它。这可能会导致您得出没有获得锁的结论,但事实并非如此。
类似地,如果您试图获取一个已经被其他人拥有的锁,则语句将阻塞,直到释放另一个锁。