
# 锁管理
在GaussDB中，并发执行的事务由于竞争资源会导致死锁。本节介绍的参数主要管理事务锁的机制。
#### deadlock_timeout
**参数说明：**设置死锁超时检测时间，以毫秒为单位。当申请的锁超过设定值时，系统会检查是否产生了死锁。该参数仅针对常规锁生效。
- 死锁的检查代价是比较高的，服务器不会在每次等待锁的时候都运行这个过程。在系统运行过程中死锁是不经常出现的，因此在检查死锁前只需等待一个相对较短的时间。增加这个值就减少了无用的死锁检查浪费的时间，但是会减慢真正的死锁错误报告的速度。在一个负载过重的服务器上，用户可能需要增大它。这个值的设置应该超过事务持续时间，这样就可以减少在锁释放之前就开始死锁检查的问题。
- 当设置[log_lock_waits](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-12-1530.html#ZH-CN_TOPIC_0000002200580666__zh-cn_topic_0000001632393697_zh-cn_topic_0289900137_zh-cn_topic_0283136613_zh-cn_topic_0237124723_zh-cn_topic_0059778400_s0e43c2815b8a4f369d5b150535d1703f)为on时，deadlock_timeout决定一个等待时间来将查询执行过程中的锁等待耗时信息写入日志。如果要研究锁延时情况，可以设置deadlock_timeout的值比正常情况小。
该参数属于SUSET类型参数，请参考[表1](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-12-1496.html#ZH-CN_TOPIC_0000002235341069__zh-cn_topic_0000001581993740_zh-cn_topic_0289899927_zh-cn_topic_0283137176_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**取值范围：**整型，1\~2147483647，单位为毫秒（ms）。
**默认值：**1s
 #### lockwait_timeout
**参数说明：**控制单个锁的最长等待时间。当申请的锁等待时间超过设定值时，系统会报错。该参数仅针对常规锁生效。
该参数属于SUSET类型参数，请参考[表1](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-12-1496.html#ZH-CN_TOPIC_0000002235341069__zh-cn_topic_0000001581993740_zh-cn_topic_0289899927_zh-cn_topic_0283137176_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**取值范围：**整型，0 \~ INT_MAX，单位为毫秒（ms）。
**默认值：**20min
#### update_lockwait_timeout
**参数说明：**允许并发更新参数开启情况下，该参数控制并发更新同一行时单个锁的最长等待时间。当申请的锁等待时间超过设定值时，系统会报错。该参数仅针对常规锁生效。
该参数属于SUSET类型参数，请参考[表1](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-12-1496.html#ZH-CN_TOPIC_0000002235341069__zh-cn_topic_0000001581993740_zh-cn_topic_0289899927_zh-cn_topic_0283137176_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**取值范围：**整型，0 \~ 2147483647，单位为毫秒（ms）。
**默认值：**2min（120000ms）
#### max_locks_per_transaction
**参数说明：**控制每个事务能够得到的平均的对象锁的数量。
- 共享的锁表的大小是以假设任意时刻最多只有max_locks_per_transaction\*(max_connections+max_prepared_transactions) 个独立的对象需要被锁住为基础进行计算的。不超过设定数量的多个对象可以在任一时刻同时被锁定。当在一个事务里面修改很多不同的表时，可能需要提高这个默认数值。只能在数据库启动的时候设置。
- 增大这个参数可能导致GaussDB请求更多的System V共享内存，有可能超过操作系统的缺省配置。
- 当运行备机时，请将此参数设置不小于主机上的值，否则，在备机上查询操作不会被允许。
该参数属于POSTMASTER类型参数，请参考[表1](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-12-1496.html#ZH-CN_TOPIC_0000002235341069__zh-cn_topic_0000001581993740_zh-cn_topic_0289899927_zh-cn_topic_0283137176_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**取值范围：**整型，10 \~ INT_MAX
**默认值：**
256（196核CPU/1536G内存，128核CPU/1024G内存，104核CPU/1024G内存，96核CPU/1024G内存，96核CPU/768G内存，80核CPU/640G内存，64核CPU/512G内存，60核CPU/480G内存，32核CPU/256G内存，16核CPU/128G内存，8核CPU/64G内存，4核CPU/32G内存）；64（4核CPU/16G内存）
#### max_pred_locks_per_transaction
**参数说明：**控制每个事务允许断定锁的最大数量，是一个平均值。
- 共享的断定锁表的大小是以假设任意时刻最多只有max_pred_locks_per_transaction\*(max_connections+max_prepared_transactions) 个独立的对象需要被锁住为基础进行计算的。不超过设定数量的多个对象可以在任一时刻同时被锁定。当在一个事务里面修改很多不同的表时，可能需要提高这个默认数值。只能在服务器启动的时候设置。
- 增大这个参数可能导致GaussDB请求更多的System V共享内存，有可能超过操作系统的缺省配置。
该参数属于POSTMASTER类型参数，请参考[表1](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-12-1496.html#ZH-CN_TOPIC_0000002235341069__zh-cn_topic_0000001581993740_zh-cn_topic_0289899927_zh-cn_topic_0283137176_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**取值范围：**整型，10 \~ INT_MAX
**默认值：**64
#### gs_clean_timeout
**参数说明：**控制主节点周期性清理临时表的时间，是一个平均值。
- 数据库连接异常终止时，通常会有临时表残留，此时需要对数据库中的临时表进行清理。
- 增大这个参数可能导致GaussDB临时表清理时间延长。
该参数属于SIGHUP类型参数，请参考[表1](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-12-1496.html#ZH-CN_TOPIC_0000002235341069__zh-cn_topic_0000001581993740_zh-cn_topic_0289899927_zh-cn_topic_0283137176_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**取值范围：**整型，0 \~ 2147483，单位为秒（s）。
**默认值：**1min
#### partition_lock_upgrade_timeout
**参数说明：**在执行某些查询语句的过程中，会需要将分区表上的锁级别由允许读的ExclusiveLock级别升级到读写阻塞的AccessExclusiveLock级别。如果此时已经存在并发的读事务，那么该锁升级操作将阻塞等待。partition_lock_upgrade_timeout为尝试锁升级的等待超时时间。
- 在分区表上进行MERGE PARTITION和CLUSTER PARTITION操作时，都利用了临时表进行数据重排和文件交换，为了最大程度提高分区上的操作并发度，在数据重排阶段给相关分区加锁ExclusiveLock，在文件交换阶段加锁AccessExclusiveLock。
- 常规加锁方式是等待加锁，直到加锁成功，或者等待时间超过[lockwait_timeout]发生超时失败。
- 在分区表上进行MERGE PARTITION或CLUSTER PARTITION操作时，进入文件交换阶段需要申请加锁AccessExclusiveLock，加锁方式是尝试性加锁，加锁成功了则立即返回，不成功则等待50ms后继续下次尝试，加锁超时时间使用会话级设置参数partition_lock_upgrade_timeout。
- 特殊值：若partition_lock_upgrade_timeout取值-1，表示无限等待，即不停地尝试锁升级，直到加锁成功。 该参数属于USERSET类型参数，请参考[表1](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-12-1496.html#ZH-CN_TOPIC_0000002235341069__zh-cn_topic_0000001581993740_zh-cn_topic_0289899927_zh-cn_topic_0283137176_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
  
**取值范围：**整型，最小值-1，最大值3000，单位为秒（s）。
**默认值：**1800
#### fault_mon_timeout
**参数说明：** 轻量级死锁检测周期。该参数属于SIGHUP类型参数，请参考[表1](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-12-1496.html#ZH-CN_TOPIC_0000002235341069__zh-cn_topic_0000001581993740_zh-cn_topic_0289899927_zh-cn_topic_0283137176_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**取值范围：**整型，最小值0，最大值1440，单位为分钟（min）
**默认值：**5min
#### enable_online_ddl_waitlock
**参数说明：**控制DDL是否会阻塞等待pg_advisory_lock等数据库锁。主要用于OM在线操作场景，不建议用户设置。
该参数属于SIGHUP类型参数，参考[表1](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-12-1496.html#ZH-CN_TOPIC_0000002235341069__zh-cn_topic_0000001581993740_zh-cn_topic_0289899927_zh-cn_topic_0283137176_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**取值范围：**布尔型
- on表示开启。
- off表示关闭。
**默认值：**off
#### xloginsert_locks
参数说明：控制用于并发写预写式日志锁的个数。主要用于提高写预写式日志的效率。
该参数属于POSTMASTER类型参数，参考[表1](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-12-1496.html#ZH-CN_TOPIC_0000002235341069__zh-cn_topic_0000001581993740_zh-cn_topic_0289899927_zh-cn_topic_0283137176_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
取值范围：整型，最小值1，最大值1000。若CPU为NUMA架构，数值必须为NUMA节点数量的整数倍。
**默认值：**16
#### num_internal_lock_partitions
**参数说明：**控制内部轻量级锁分区的个数。主要用于各类场景的性能调优。内容以关键字和数字的KV方式组织，各个不同类型锁之间以逗号隔开。先后顺序对设置结果不影响，例如"CLOG_PART=256,CSNLOG_PART=512"等同于"CSNLOG_PART=512,CLOG_PART=256"。重复设置同一关键字时，以最后一次设置为准，例如"CLOG_PART=256,CLOG_PART=2"，设置的结果为CLOG_PART=2。当没有设置关键字时，则为默认值，各类锁的使用描述和最大、最小、默认值如下。
- CLOG_PART：CLOG文件控制器的个数，增大该值可以提高CLOG日志写入效率，提升事务提交性能，但是会增大内存使用；减小该值会减少相应内存使用，但可能使得CLOG日志写入冲突变大，影响性能。最小值为1，最大值为256。
- CSNLOG_PART：CSNLOG文件控制器的个数，增大该值可以提高CSNLOG日志写入效率，提升事务提交性能，但是会增大内存使用；减小该值会减少相应内存使用，但可能使得CSNLOG日志写入冲突变大，影响性能。最小值为1，最大值为512。
- LOG2_LOCKTABLE_PART：常规锁表锁分区个数的2对数，增大该值可以提升正常流程常规锁获取锁的并行度，但是可能增加锁转移和锁消除时的耗时，对于等待事件在LockMgrLock时，可以调大该锁增加性能。最小值4，即锁分区数为16；最大值为16，即锁分区数为65536。
- TWOPHASE_PART：两阶段事务锁的分区数，调大该值可以提高两阶段事务提交的并发数。最小值为1，最大值为64。
- FASTPATH_PART：每个线程可以不通过主锁表拿锁的最大锁个数，对于分区表读取、更新、插入、删除操作且等待事件在LockMgrLock时，可以通过调大该值避免获取LockMgrLock提升性能，建议调整数量大于等于分区数\*（1+本地索引数量）+全局索引数量+10，调大该值会额外增加内存。最小值为20，最大值为10000。
该参数属于POSTMASTER类型参数，参考[表1](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-12-1496.html#ZH-CN_TOPIC_0000002235341069__zh-cn_topic_0000001581993740_zh-cn_topic_0289899927_zh-cn_topic_0283137176_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**取值范围：**字符串
**默认值：**
'CLOG_PART=256,CSNLOG_PART=512,LOG2_LOCKTABLE_PART=4,TWOPHASE_PART=1,FASTPATH_PART=20'（196核CPU/1536G内存，128核CPU/1024G内存，104核CPU/1024G内存，96核CPU/1024G内存，96核CPU/768G内存，80核CPU/640G内存，64核CPU/512G内存，60核CPU/480G内存，32核CPU/256G内存，16核CPU/128G内存，8核CPU/64G内存，4核CPU/32G内存）；'CLOG_PART=8,CSNLOG_PART=16,LOG2_LOCKTABLE_PART=4,TWOPHASE_PART=1,FASTPATH_PART=20'（4核CPU/16G内存）
#### enable_wait_exclusive_lock
**参数说明：**控制ProcArrayLock的排他锁hang死检测与治愈功能的开关。
该参数属于SIGHUP类型参数，参考[表1](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-12-1496.html#ZH-CN_TOPIC_0000002235341069__zh-cn_topic_0000001581993740_zh-cn_topic_0289899927_zh-cn_topic_0283137176_zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**取值范围：**布尔型
- on：表示开启。
- off：表示关闭。
**默认值：**on
