锁定

共享和专用锁

X DevAPI支持锁定匹配行,mysqlx.Collection.find ()mysqlx.Table.select ()方法,它允许安全事务文档/行集合或表上更新。

有两种类型的锁:

例子

设置

假设的存在test_schema.test_collection收集。

[{“_id”:“1”,“名称”:“弗雷德”,“年龄”:21},{“_id”:“2”,“名称”:“Sakila”,“年龄”:23},{“_id”:“3”,“名称”:“迈克”,“年龄”:42})

获得会话和集合对象。

#客户1session_1=mysqlxget_session(“根:@localhost: 33060”)schema_1=session_1get_schema(“test_schema”)collection_1=schema_1get_collection(“test_collection”)#客户2session_2=mysqlxget_session(“根:@localhost: 33060”)schema_2=session_2get_schema(“test_schema”)collection_2=schema_2get_collection(“test_collection”)

共享锁

#客户1session_1start_transaction()collection_1找到(“_id = ' 1 '”)lock_shared()执行()#客户2session_2start_transaction()collection_2找到(“_id = ' 2 '”)lock_shared()执行()#应该立即返回collection_2找到(“_id = ' 1 '”)lock_shared()执行()#应该立即返回#客户1session_1回滚()#客户2session_2回滚()

独占锁

#客户1session_1start_transaction()collection_1找到(“_id = ' 1 '”)lock_exclusive()执行()#客户2session_2start_transaction()collection_2找到(“_id = ' 2 '”)lock_exclusive()执行()#应该立即返回collection_2找到(“_id = ' 1 '”)lock_exclusive()执行()# session_2应该阻止#客户1session_1回滚()# session_2现在应该开启#客户2session_2回滚()

共享锁后专用

#客户1session_1start_transaction()collection_1找到(“_id = ' 1 '”)lock_exclusive()执行()#客户2session_2start_transaction()collection_2找到(“_id = ' 2 '”)lock_shared()执行()#应该立即返回collection_2找到(“_id = ' 1 '”)lock_shared()执行()# session_2块#客户1session_1回滚()# session_2现在应该开启#客户2session_2回滚()

互斥型锁后共享

#客户1session_1start_transaction()collection_1找到(“_id (' 1 ', ' 3 ')”)lock_shared()执行()#客户2session_2start_transaction()collection_2找到(“_id = ' 2 '”)lock_exclusive()执行()#应该立即返回collection_2找到(“_id = 3”)lock_shared()执行()#应该立即返回collection_2找到(“_id = ' 1 '”)lock_exclusive()执行()# session_2应该阻止#客户1session_1回滚()# session_2现在应该开启#客户2session_2回滚()

锁定NOWAIT和SKIP_LOCKED

如果一行锁的事务,事务请求相同的锁定行必须等到阻塞事务释放行锁。然而,等待释放行锁是没有必要的,如果你想要查询时立即返回请求的行锁,或如果不包括锁定行从结果集是可以接受的。

为了避免等待其他事务释放行锁,mysqlx.LockContention.NOWAITmysqlx.LockContention.SKIP_LOCKED锁竞争选项可以使用。

NOWAIT

一个锁定阅读使用mysqlx.LockContention.NOWAIT永远等待获得一行锁。立即执行查询,没有一个错误如果请求的行锁。

阅读分享锁定文档使用的例子mysqlx.ReadStatement.lock_shared ():

#客户1session_1start_transaction()collection_1找到(“_id =: id”)lock_shared()绑定(“id”,“1”)执行()#客户2session_2start_transaction()collection_2找到(“_id =: id”)lock_shared(mysqlxLockContentionNOWAIT)\绑定(“id”,“1”)执行()#执行应立即返回,没有阻止,也没有错误collection_2修改(“_id = ' 1 '”)(“年龄”,43)执行()#事务应该被阻塞#客户1session_1提交()# session_2现在应该开启#客户2session_2回滚()

SKIP_LOCKED

一个锁定阅读使用mysqlx.LockContention.SKIP_LOCKED永远等待获得一行锁。立即执行的查询,删除锁定行从结果集。

阅读分享锁定文档使用的例子mysqlx.ReadStatement.lock_exclusive ():

#客户1session_1start_transaction()collection_1找到(“_id =: id”)lock_shared()绑定(“id”,“1”)执行()#客户2session_2start_transaction()collection_2找到(“_id =: id”)lock_exclusive(mysqlxLockContentionSKIP_LOCKED)\绑定(“id”,“1”)执行()#执行应立即返回,没有错误#客户1session_1提交()#客户2collection_2找到(“_id =: id”)lock_exclusive(mysqlxLockContentionSKIP_LOCKED)\绑定(“id”,1)执行()#自提交在“客户端1”然后读现在必须是可能的#不抛出错误session_2回滚()