• 南大通用数据库-Gbase-8a-学习-42-定位与释放锁


    目录

    一、测试版本

    二、模拟锁表场景

    1、查看自动提交参数

    2、关闭自动提交

    3、测试表结构

    4、测试数据

    5、会话一更新数据不提交

    6、会话二更新数据卡住

    7、会话三查看连接信息

    8、会话三查看锁信息

    9、解决方法

    10、会话一插入数据不提交

    11、会话二更新报错

    三、总结


    一、测试版本

    名称
    CPUIntel(R) Core(TM) i5-1035G1 CPU @ 1.00GHz
    操作系统CentOS Linux release 7.9.2009 (Core)
    内存3G
    逻辑核数2
    Gbase8a版本8.6.2-R43

    二、模拟锁表场景

    打开三个会话。

    1、查看自动提交参数

    1. gbase> show variables like'%commit%';
    2. +-----------------------------------------------------------+----------+
    3. | Variable_name | Value |
    4. +-----------------------------------------------------------+----------+
    5. | _t_gcluster_commit_revert_flag_test | 1 |
    6. | autocommit | ON |
    7. | gbase_tcmalloc_aggressive_decommit_threadhold_load_factor | 0.900000 |
    8. | gbase_tcmalloc_balanced_decommit_threadhold_load_factor | 0.600000 |
    9. | gcluster_kafka_batch_commit_dml_count | 100000 |
    10. | gcluster_kafka_parallel_commit | 1 |
    11. +-----------------------------------------------------------+----------+
    12. 6 rows in set (Elapsed: 00:00:00.00)

    2、关闭自动提交

    1. gbase> set autocommit = 0;
    2. Query OK, 0 rows affected (Elapsed: 00:00:00.00)

    前两个会话设置非自动提交。

    3、测试表结构

    1. gbase> desc czg.testtab;
    2. +-------+---------------+------+-----+-------------------+-----------------------------+
    3. | Field | Type | Null | Key | Default | Extra |
    4. +-------+---------------+------+-----+-------------------+-----------------------------+
    5. | a | int(11) | YES | | NULL | |
    6. | b | double | YES | | NULL | |
    7. | c | varchar(100) | YES | MUL | NULL | |
    8. | d | text | YES | | NULL | |
    9. | e | blob | YES | | NULL | |
    10. | f | longblob | YES | | NULL | |
    11. | g | date | YES | | NULL | |
    12. | h | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
    13. | i | decimal(10,2) | YES | | NULL | |
    14. +-------+---------------+------+-----+-------------------+-----------------------------+
    15. 9 rows in set (Elapsed: 00:00:00.05)

    4、测试数据

    1. gbase> select * from czg.testtab limit 10;
    2. +------+------+------+--------------------+---------------------+--------------------------+------------+---------------------+------+
    3. | a | b | c | d | e | f | g | h | i |
    4. +------+------+------+--------------------+---------------------+--------------------------+------------+---------------------+------+
    5. | 1 | 1.1 | czg | 快乐的小天使 | qwertasdsdfzxczxxv | gregergjsfishfuieehfuiew | 1995-09-18 | 2022-08-03 09:24:00 | 1.00 |
    6. | 1 | 1.1 | czg | 快乐的小天使 | qwertasdsdfzxczxxv | gregergjsfishfuieehfuiew | 1995-09-18 | 2022-08-03 09:24:00 | 1.00 |
    7. | 1 | 1.1 | czg | 快乐的小天使 | qwertasdsdfzxczxxv | gregergjsfishfuieehfuiew | 1995-09-18 | 2022-08-03 09:24:00 | 1.00 |
    8. | 1 | 1.1 | czg | 快乐的小天使 | qwertasdsdfzxczxxv | gregergjsfishfuieehfuiew | 1995-09-18 | 2022-08-03 09:24:00 | 1.00 |
    9. | 1 | 1.1 | czg | 快乐的小天使 | qwertasdsdfzxczxxv | gregergjsfishfuieehfuiew | 1995-09-18 | 2022-08-03 09:24:00 | 1.00 |
    10. | 2 | 1.1 | czg | 快乐的小天使 | qwertasdsdfzxczxxv | gregergjsfishfuieehfuiew | 1995-09-18 | 2022-08-03 09:24:00 | 2.00 |
    11. | 2 | 4.1 | czg | 快乐的小天使 | qwertasdsdfzxczxxv | gregergjsfishfuieehfuiew | 1995-09-18 | 2022-08-03 09:24:00 | 1.10 |
    12. | 2 | 4.1 | czg | 快乐的小天使 | qwertasdsdfz\xczxxv | gregergjsfishfuieehfuiew | 1995-09-18 | 2022-08-03 09:24:00 | 1.10 |
    13. | 2 | 4.1 | czg | 快乐的小天使 | qwertasdsdfz.xczxxv | gregergjsfishfuieehfuiew | 1995-09-18 | 2022-08-03 09:24:00 | 1.10 |
    14. | 2 | 4.1 | czg | 快乐的小天使 | qwertasdsdfz.xczxxv | gregergjsfishfuieehfuiew | 1995-09-18 | 2022-08-03 09:24:00 | 1.10 |
    15. +------+------+------+--------------------+---------------------+--------------------------+------------+---------------------+------+
    16. 10 rows in set (Elapsed: 00:00:02.51)

    5、会话一更新数据不提交

    1. gbase> update czg.testtab set d = 'JJLGG' where a = 2;
    2. Query OK, 1310720 rows affected (Elapsed: 03:28:21.03)
    3. Rows matched: 1310720 Changed: 1310720 Warnings: 0

    6、会话二更新数据卡住

    gbase> update czg.testtab set d = 'HappySunshine' where a = 1;
    

    我们更新的是不同的行,却锁住了,说明Gbase8a不支持行锁,这里加的是表锁。

    7、会话三查看连接信息

    1. [gbase@czg2 ~]$ gccli -e "show detail processlist;"
    2. +-----+-------+-----------------+----------------------+--------------------+---------+--------+-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------+--------------------------------------------------------+
    3. | Id | Tid | User | Host | db | Command | Time | State | Lock | Wait | Info |
    4. +-----+-------+-----------------+----------------------+--------------------+---------+--------+-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------+--------------------------------------------------------+
    5. | 1 | 5752 | event_scheduler | localhost | NULL | Daemon | 80337 | Waiting for next activation | NULL | NULL | NULL |
    6. | 276 | 78263 | root | localhost | NULL | Sleep | 172223 | | NULL | NULL | NULL |
    7. | 277 | 78372 | root | 192.168.142.12:35329 | zxj | Sleep | 172223 | | NULL | NULL | NULL |
    8. | 585 | 94012 | root | localhost | information_schema | Query | 205 | checking permissions | czg | czg.testtab02076d53-3c94-4aa4-b020-b9df0c802739 | update czg.testtab set d = 'HappySunshine' where a = 1 |
    9. | 589 | 95886 | root | localhost | NULL | Sleep | 19292 | | czg;czg.testtab02076d53-3c94-4aa4-b020-b9df0c802739;czg.testtab580D5F90-B287-4199-B057-E6FBD44B5BFA;czg.testtab6ef6f8a9-87f0-4d6c-8043-899367d02df3 | NULL | NULL |
    10. | 642 | 2049 | root | localhost | NULL | Query | 0 | NULL | NULL | NULL | show detail processlist |
    11. +-----+-------+-----------------+----------------------+--------------------+---------+--------+-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------+--------------------------------------------------------+

    这些字段的含义为:

    字段描述
    Id连接编号。
    Tid线程号。
    User登录数据库用户。
    Host连接源端的ip和端口。
    db连接的数据库。
    Command当前执行的命令。
    Time上面命令执行的时间。(单位:秒)
    StateSQL的运行状态。
    Lock持有的锁。
    Wait等待的锁。
    Info执行的SQL语句。

    我们主要看589和585。

    585的State:checking permissions,表示在检查权限。Wait:czg.testtab02076d53-3c94-4aa4-b020-b9df0c802739,表示等待锁czg.testtab02076d53-3c94-4aa4-b020-b9df0c802739。

    589的Lock:czg;czg.testtab02076d53-3c94-4aa4-b020-b9df0c802739;czg.testtab580D5F90-B287-4199-B057-E6FBD44B5BFA;czg.testtab6ef6f8a9-87f0-4d6c-8043-899367d02df3,表示持有锁:

    (1)czg

    (2)czg.testtab02076d53-3c94-4aa4-b020-b9df0c802739(和585等待的锁一样)

    (3)czg.testtab580D5F90-B287-4199-B057-E6FBD44B5BFA

    (4)czg.testtab6ef6f8a9-87f0-4d6c-8043-899367d02df3

    说明589一直占有锁,未释放,导致585一直等待。再看589的Command:Sleep,表示为空闲状态。那我们可以断定是589没有执行提交操作,导致的锁等待。如果589是Query,那就有可能是执行慢,导致其他会话卡住。具体情况具体分析吧。

    8、会话三查看锁信息

    1. [gbase@czg2 ~]$ gcadmin showlock
    2. +========================================================================================================================+
    3. | GCLUSTER LOCK |
    4. +========================================================================================================================+
    5. +-----------------------------------------------+--------------+------------------------------+--------------+------+----+
    6. | Lock name | owner | content | create time |orphan|type|
    7. +-----------------------------------------------+--------------+------------------------------+--------------+------+----+
    8. | czg |192.168.142.12|LOCK_Reserved: 589(LWP:95886) |20231109105742|FALSE | S |
    9. +-----------------------------------------------+--------------+------------------------------+--------------+------+----+
    10. | czg |192.168.142.12|LOCK_Reserved: 585(LWP:94012) |20231109161549|FALSE | S |
    11. +-----------------------------------------------+--------------+------------------------------+--------------+------+----+
    12. |czg.testtab02076d53-3c94-4aa4-b020-b9df0c802739|192.168.142.12|LOCK_Rebalance: 589(LWP:95886)|20231109142557|FALSE | E |
    13. +-----------------------------------------------+--------------+------------------------------+--------------+------+----+
    14. |czg.testtab580d5f90-b287-4199-b057-e6fbd44b5bfa|192.168.142.12| LOCK_DMLEX: 589(LWP:95886) |20231109142557|FALSE | E |
    15. +-----------------------------------------------+--------------+------------------------------+--------------+------+----+
    16. |czg.testtab6ef6f8a9-87f0-4d6c-8043-899367d02df3|192.168.142.12| LOCK_DMLEX: 589(LWP:95886) |20231109142557|FALSE | E |
    17. +-----------------------------------------------+--------------+------------------------------+--------------+------+----+
    18. Total : 5
    参数描述
    Lock name锁的名称。
    owner持有锁的节点IP。
    content第一个数字是Id连接编号。
    第二个数字是线程号。
    create time锁创建日期。
    orphan是否为孤儿锁。
    typeS:共享锁。E:排他锁。

    9、解决方法

    (1)方法一:589对应的会话进行提交。

    (2)方法二:开一个新会话kill 589。

    (3)方法三:通过官方的python gcware接口去释放。

    查看锁demo

    1. #encoding:utf-8
    2. import gcware
    3. SUCCESS_FLAG = 1
    4. FAIL_FLAG = 0
    5. def ReleaseLock(TableName, LockId):
    6. if gcware.unlocktableforce(TableName,LockId) != 0:
    7. print("ReleaseLock : OK, TableName : %s, LockId : %s"%(TableName,LockId))
    8. return SUCCESS_FLAG
    9. else:
    10. print("ReleaseLock : Fail, TableName : %s, LockId : %s"%(TableName,LockId))
    11. return FAIL_FLAG
    12. if __name__ == '__main__':
    13. for i in gcware.getlocks():
    14. for j in i:
    15. print("%-20s : %s"%(j,i[j]))
    16. print("=========================")

    TableName就是下面的name,LockId就是下面的lockid。大家可以自己调用ReleaseLock尝试释放锁,建议大家不要用gcware接口。

    运行效果

    1. create time : 20231109105742
    2. name : czg
    3. lockid : 9114802754034860036
    4. orphan : FALSE
    5. content : LOCK_Reserved: 589(LWP:95886)
    6. owner : 192.168.142.12
    7. type : SHARE
    8. =========================
    9. create time : 20231109161549
    10. name : czg
    11. lockid : 171802565900500995
    12. orphan : FALSE
    13. content : LOCK_Reserved: 585(LWP:94012)
    14. owner : 192.168.142.12
    15. type : SHARE
    16. =========================
    17. create time : 20231109142557
    18. name : czg.testtab02076d53-3c94-4aa4-b020-b9df0c802739
    19. lockid : 8869015163097841664
    20. orphan : FALSE
    21. content : LOCK_Rebalance: 589(LWP:95886)
    22. owner : 192.168.142.12
    23. type : EXCLUSIVE
    24. =========================
    25. create time : 20231109142557
    26. name : czg.testtab580d5f90-b287-4199-b057-e6fbd44b5bfa
    27. lockid : 2937847747467804673
    28. orphan : FALSE
    29. content : LOCK_DMLEX: 589(LWP:95886)
    30. owner : 192.168.142.12
    31. type : EXCLUSIVE
    32. =========================
    33. create time : 20231109142557
    34. name : czg.testtab6ef6f8a9-87f0-4d6c-8043-899367d02df3
    35. lockid : 6284283086788100098
    36. orphan : FALSE
    37. content : LOCK_DMLEX: 589(LWP:95886)
    38. owner : 192.168.142.12
    39. type : EXCLUSIVE
    40. =========================

    10、会话一插入数据不提交

    1. gbase> insert into czg.testtab values(1,1.1,'asdasd','zxj','dfd','asd','1995-09-18','2023-08-03 09:24:00',1.00);
    2. Query OK, 1 row affected (Elapsed: 00:00:00.14)

    11、会话二更新报错

    1. gbase> update czg.testtab set d = 'JJLGG' where a = 2;
    2. ERROR 1727 (HY000): try to lock in gcluster failed: (GBA-02LO-0002) Can't lock file(already exists).

    三、总结

    序号描述
    1Gbase8a锁支持粒度为表级。
    2并发更新或删除同一张表时,其中一个会话执行较慢,导致其他会话等待。
    3会话一更新或删除A表,会话二插入A表,无论会话一二的执行顺序,都会提示报错:ERROR 1727 (HY000): try to lock in gcluster failed: (GBA-02LO-0002) Can't lock file(already exists).。

  • 相关阅读:
    Flutter的基础知识、核心概念以及一些实际开发技巧
    “推广+搞笑剧情”,如何碰撞出爆款的火花?
    Windows10/11开启文件系统对大小写敏感
    嵌入式学习——C语言基础——day8
    Microsoft Visual Studio C++开发环境的配置及使用
    EtherCAT从站EEPROM组成信息详解(2):字8-15产品标识区
    js题解(三)
    使用Python绘制一个自动变色爱心
    粒子群算法和鲸鱼算法的比较(Matlab代码实现)
    Linux之部署前后端分离项目
  • 原文地址:https://blog.csdn.net/qq_45111959/article/details/134311021