产品概述
应用场景
产品架构
实例类型
兼容性说明
使用规范建议







locktables sbtest1 read;Query OK,0rows affected,1 warning (0.02 sec)showwarnings;+---------+------+-----------------------------------------------------------------------------------+|Level| Code | Message |+---------+------+-----------------------------------------------------------------------------------+| Warning |8533|LOCK/UNLOCKoptionis used for compatibility only,and it does not actually work.|+---------+------+-----------------------------------------------------------------------------------+
# 确认 session1、session2 连在同一节点# 如果不是连在同一节点上,ddl是可以执行成功的,参考“跨节点 DDL-DML 冲突”show variables like'hostname';#session1BEGIN;UPDATE sbtest1 SET k =0WHERE id =999;#session2ALTERTABLE sbtest1 ADDCOLUMN new_column VARCHAR(255);#查看 metadata_locks,可以看到:#第一行LOCK_STATUS=GRANTED的记录正是 session1,表示已获得 MDL 锁;#第二行LOCK_STATUS=PENDING的记录正是 session2,表示获取 MDL 锁被挂起。#需要在开头加上 broadcast HINT 指定在所有节点广播查询。/*#broadcast*/select*from performance_schema.metadata_locks where OBJECT_NAME='sbtest1' \\G***************************1.row***************************OBJECT_TYPE: TABLEOBJECT_SCHEMA: testOBJECT_NAME: sbtest1COLUMN_NAME: NULLOBJECT_INSTANCE_BEGIN: 140384374661472LOCK_TYPE: SHARED_WRITELOCK_DURATION: TRANSACTIONLOCK_STATUS: GRANTEDSOURCE: sql_parse.cc:6373OWNER_THREAD_ID: 4879164OWNER_EVENT_ID: 1***************************2.row***************************OBJECT_TYPE: TABLEOBJECT_SCHEMA: testOBJECT_NAME: sbtest1COLUMN_NAME: NULLOBJECT_INSTANCE_BEGIN: 140375267009376LOCK_TYPE: SHAREDLOCK_DURATION: EXPLICITLOCK_STATUS: PENDINGSOURCE: ddl_executer.cc:245OWNER_THREAD_ID: 4879122OWNER_EVENT_ID: 12rowsinset(0.02 sec)#当查询多次都发现 LOCK_STATUS: GRANTED 的会话一直没有变化时,可通过 OWNER_THREAD_ID 定位到持有锁的线程所对应的 SESSION ID,在确认该会话可安全终止后,先通过 KILL 命令结束该会话,再重新发起 DDL 操作。/*#broadcast*/select*from performance_schema.threads where THREAD_ID=4879164\\G***************************1.row***************************THREAD_ID: 4879164NAME: thread/sql/one_connectionTYPE: FOREGROUNDPROCESSLIST_ID: 2346946PROCESSLIST_USER: xxxxxPROCESSLIST_HOST: xxx.xxx.xxx.xxxPROCESSLIST_DB: testPROCESSLIST_COMMAND: SleepPROCESSLIST_TIME: 1330PROCESSLIST_STATE:PROCESSLIST_INFO:PARENT_THREAD_ID:ROLE:INSTRUMENTED: YESHISTORY: YESCONNECTION_TYPE: TCP/IPTHREAD_OS_ID: 45448RESOURCE_GROUP:SQLEngine_id: node-tdsql3-***-0021rowinset(0.02 sec)#KILL 持锁者(LOCK_STATUS: GRANTED 会话)#session1 被杀#session2ALTERTABLE sbtest1 ADDCOLUMN new_column VARCHAR(255);Query OK,0rows affected (1.67 sec)Records: 0 Duplicates: 0 Warnings: 0
# 这里 session1、session2 无论是否连到同一节点,结果都是一样的;因为行锁是存储层的,两个会话发生行锁冲突,说明最终都访问了相同存储节点的主副本#session1SELECT id FROM sbtest1 ORDERBY id limit10;+----+| id |+----+|1||3||5||7||9||11||12||13||14||15|+----+10rowsinset(9.23 sec)BEGIN;UPDATE sbtest1 SET k=50000WHERE id<=11AND id>=5;#session2INSERTINTO sbtest1(id) VALUES(8);#查询当前节点上,持锁者(Lock Holder)的悲观锁信息。#先查询 data_lock_waits 表,获取 BLOCKING_ENGINE_LOCK_ID 字段【悲观锁ID】;再根据该字段值去查询 data_locks 表,获取持锁者信息。#TDStore 的 range lock 左闭右开,可以看到列 ENGINE_LOCK_ID 中显示为 [5,12) 区间。SELECT * FROM performance_schema.data_lock_waits\\G*************************** 1. row ***************************ENGINE: RocksDBREQUESTING_ENGINE_LOCK_ID: 29746913880309907_000082E380000008REQUESTING_NODE_ID: 3REQUESTING_NODE_NAME: node-tdsql3-***-003REQUESTING_ENGINE_TRANSACTION_ID: 29746913880309907REQUESTING_THREAD_ID: 428330REQUESTING_EVENT_ID: 0REQUESTING_OBJECT_INSTANCE_BEGIN: 140197932217896BLOCKING_ENGINE_LOCK_ID: 29746911900598447_[000082E380000005,000082E38000000C)BLOCKING_NODE_ID: 1BLOCKING_NODE_NAME: node-tdsql3-***-001BLOCKING_ENGINE_TRANSACTION_ID: 29746911900598447BLOCKING_THREAD_ID: 592422BLOCKING_EVENT_ID: 0BLOCKING_OBJECT_INSTANCE_BEGIN: 140197201734928TINDEX_ID: 33507DATA_SPACE_TYPE: DATA_SPACE_TYPE_USERREPLICATION_GROUP_ID: 868437KEY_RANGE_REGION_ID: 41824091 row in set (0.03 sec)SELECT data_locks.* FROM performance_schema.data_locks WHERE engine_lock_id='29746911900598447_[000082E380000005,000082E38000000C)'\\G*************************** 1. row ***************************ENGINE: RocksDBENGINE_LOCK_ID: 29746911900598447_[000082E380000005,000082E38000000C)ENGINE_TRANSACTION_ID: 29746911900598447THREAD_ID: 592422EVENT_ID: NULLOBJECT_SCHEMA:OBJECT_NAME:PARTITION_NAME: NULLSUBPARTITION_NAME: NULLINDEX_NAME: NULLOBJECT_INSTANCE_BEGIN: 140197201734928LOCK_TYPE: PRE_RANGELOCK_MODE: WriteLOCK_STATUS: GRANTEDLOCK_DATA: NULLSTART_KEY: 000082E380000005END_KEY: 000082E38000000CEXCLUDE_START_KEY: 0BLOCKING_TRANSACTION_NUM: 1BLOCKING_CHECK_READ_TRANSACTION_NUM: 0READ_LOCKED_NUM: 0TINDEX_ID: 33507DATA_SPACE_TYPE: DATA_SPACE_TYPE_USERREPLICATION_GROUP_ID: 868437KEY_RANGE_REGION_ID: 4182409PROCESSLIST_ID: 1693568NODE_ID: 1NODE_NAME: node-tdsql3-***-0011 row in set (0.03 sec)# 查看持锁者(Lock Holder)的会话信息。# 说明:data_locks 表中的 THREAD_ID 为 Performance Schema 的内部线程 ID。如需查询对应的会话信息,请使用 PROCESSLIST_ID 字段关联 information_schema.processlist 表。此外,NODE_ID 和 NODE_NAME 字段可用于定位该事务所在的 SQLEngine 节点。select * from information_schema.processlist where id=1093359\\G***************************1.row***************************ID: 1093359USER: tdsql_adminHOST: xxx.xxx.xxx.xxx:35956DB: testCOMMAND: SleepTIME: 946STATE: NULLINFO: NULLTIME_MS: 945727ROWS_SENT: 0ROWS_EXAMINED: 41rowinset(0.12 sec)#KILL 持锁者(Lock Holder)后,阻塞会话执行成功。#session1 被杀#session2INSERTINTO sbtest1(id)VALUES(8);Query OK,1row affected (43.78 sec)#注意:高并发场景下,可能等待会话(Lock Waiter)队列比较长,这样可能又会再次出现持锁者(Lock Holder),可能需要多杀几次。
文档反馈