锁定¶
锁定NOWAIT和SKIP_LOCKED¶
如果一行锁的事务,事务请求相同的锁定行必须等到阻塞事务释放行锁。然而,等待释放行锁是没有必要的,如果你想要查询时立即返回请求的行锁,或如果不包括锁定行从结果集是可以接受的。
为了避免等待其他事务释放行锁,mysqlx.LockContention.NOWAIT
和mysqlx.LockContention.SKIP_LOCKED
锁竞争选项可以使用。
NOWAIT
一个锁定阅读使用mysqlx.LockContention.NOWAIT
永远等待获得一行锁。立即执行查询,没有一个错误如果请求的行锁。
阅读分享锁定文档使用的例子mysqlx.ReadStatement.lock_shared ()
:
#客户1session_1。start_transaction()collection_1。找到(“_id =: id”)。lock_shared()。绑定(“id”,“1”)。执行()#客户2session_2。start_transaction()collection_2。找到(“_id =: id”)。lock_shared(mysqlx。LockContention。NOWAIT)\。绑定(“id”,“1”)。执行()#执行应立即返回,没有阻止,也没有错误collection_2。修改(“_id = ' 1 '”)。集(“年龄”,43)。执行()#事务应该被阻塞#客户1session_1。提交()# session_2现在应该开启#客户2session_2。回滚()
SKIP_LOCKED
一个锁定阅读使用mysqlx.LockContention.SKIP_LOCKED
永远等待获得一行锁。立即执行的查询,删除锁定行从结果集。
阅读分享锁定文档使用的例子mysqlx.ReadStatement.lock_exclusive ()
:
#客户1session_1。start_transaction()collection_1。找到(“_id =: id”)。lock_shared()。绑定(“id”,“1”)。执行()#客户2session_2。start_transaction()collection_2。找到(“_id =: id”)。lock_exclusive(mysqlx。LockContention。SKIP_LOCKED)\。绑定(“id”,“1”)。执行()#执行应立即返回,没有错误#客户1session_1。提交()#客户2collection_2。找到(“_id =: id”)。lock_exclusive(mysqlx。LockContention。SKIP_LOCKED)\。绑定(“id”,1)。执行()#自提交在“客户端1”然后读现在必须是可能的#不抛出错误session_2。回滚()