
# 锁管理
在DWS中，并发执行的事务由于竞争资源可能会导致单机死锁或分布式死锁。本节介绍的参数主要管理事务锁的机制。
 #### deadlock_timeout
**参数说明：**设置死锁超时检测时间，以毫秒为单位。当申请的锁超过设定值时，系统会检查是否产生了死锁。
- 死锁的检查代价是比较高的，服务器不会在每次等待锁的时候都运行这个过程。在系统运行过程中死锁是不经常出现的，因此在检查死锁前只需等待一个相对较短的时间。增加这个值就减少了无用的死锁检查浪费的时间，但是会减慢真正的死锁错误报告的速度。在一个负载过重的服务器上，用户可能需要增大它。这个值的设置应该超过事务持续时间，这样就可以减少在锁释放之前就开始死锁检查的问题。
- 设置[log_lock_waits](https://support.huaweicloud.com/devg-911-dws/dws_04_0916.html#ZH-CN_TOPIC_0000002202139865__s80fbcd77ad5a4cdc879fe344d17b2c13)时，这个选项也决定了在一个日志消息发出关于锁等待以前要等待的时间。当需要调查锁延迟时，请设置比正常deadlock_timeout更小的值。
**参数类型：**SUSET
**取值范围：**整型，1\~2147483647，单位为毫秒（ms）。
**默认值：**1s
#### ddl_lock_timeout
**参数说明：**通过该参数单独指定阻塞DDL语句锁等待的时间，当申请的锁等待时间超过设定值时，系统会报错。该参数仅8.1.3.200及以上版本支持。
**参数类型：**SUSET
**取值范围：**整型，0 \~ INT_MAX，单位为毫秒（ms）。
- 如果该参数的值等于0，表示该参数不生效。
- 如果该参数的值大于0，DDL锁阻塞时间为该参数的值，其它锁等待时间为lockwait_timeout参数值。
**默认值：**0
![](https://support.huaweicloud.com/devg-911-dws/public_sys-resources/note_3.0-zh-cn.png)
该参数优先级高于lockwait_timeout，只针对AccessExclusiveLock生效。
 #### ddl_select_concurrent_mode
**参数说明：**通过该参数控制DDL语句和SELECT语句并发的模式。该参数仅8.1.3.320、8.2.1及以上集群版本支持。
**参数类型：**SUSET
**取值范围：**字符串
- none：表示该参数不生效，DDL语句和select语句不能并发，保持锁等待状态。
- truncate：表示truncate语句被select语句阻塞时，truncate会中断select语句，优先执行。
- exchange：表示exchange语句被select语句阻塞时，exchange会中断select语句，优先执行。
- vacuum_full：表示vacuum full语句被select语句阻塞时，vacuum full会中断select语句，优先执行。（该参数仅9.1.0.200及以上集群版本支持）
- insert_overwrite：表示insert overwrite语句被select语句阻塞时，insert overwrite会中断select语句，优先执行。（该参数仅9.1.0.200及以上集群版本支持）
- lockstmt，表示添加八级锁被select语句阻塞时，lockstmt会中断select语句，优先执行。如果处于重分布期间select语句会重试。（该参数仅9.1.1.200及以上集群版本支持）
**默认值：**none
![](https://support.huaweicloud.com/devg-911-dws/public_sys-resources/note_3.0-zh-cn.png)
- 为了给SELECT语句预留响应信号的时间，当前版本中设置的ddl_lock_timeout的值不足1秒时按照1s处理。
- 与高级别的锁冲突（大于1级），不支持并发（比如autoanalyze_mode=normal时，同时SELECT触发了autoanalyze）。
- 该参数支持与单语句中的select或事务块中的select并发，其它版本中仅支持与单语句的select并发。对于单语句或事务块中的select并发处理，参考[enable_cancel_select_in_txnblock]参数。
- 除none以外的其他几个参数可以组合使用，比如配置为"truncate, exchange"表示truncate和exchange语句被select语句阻塞时，二者会中断select语句，优先执行。
 
 #### enable_cancel_select_in_txnblock
**参数说明：**控制在事务块中的select是否可以被中断。
**参数类型：**USERSET
**取值范围：**布尔型
- on表示开启，即事务块中的select可以被中断。
- off表示关闭，即事务块中的select不可以被中断。
**默认值：**on
![](https://support.huaweicloud.com/devg-911-dws/public_sys-resources/note_3.0-zh-cn.png)
- 该参数8.2.1.236及以上的8.2.1.2xx集群版本支持；9.1.0.200及以上集群版本支持。
- 该参数用于控制处于事务块中的SELECT是否可以被ddl_select_concurrent_mode中指定的DDL操作中断。
- ddl_select_concurrent_mode参数控制truncate、exchange等DDL语句，enable_cancel_select_in_txnblock参数控制select语句。
 
 #### lockwait_timeout
**参数说明：**控制单个锁的最长等待时间。当申请的锁等待时间超过设定值时，系统会报错。
**参数类型：**SUSET
**取值范围：**整型，0 \~ INT_MAX，单位为毫秒（ms）。
**默认值：**20min
#### update_lockwait_timeout
**参数说明：**允许并发更新参数开启情况下，该参数控制并发更新同一行时单个锁的最长等待时间。当申请的锁等待时间超过设定值时，系统会报错。
**参数类型：**SUSET
**取值范围：**整型，0 \~ INT_MAX，单位为毫秒（ms）。
**默认值：**2min
#### 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 \~ 3000，单位为秒（s）。
**默认值：**1800
#### enable_release_scan_lock
**参数说明：**控制SELECT语句是否在语句执行结束后将一级锁释放。 打开此开关，可以缓解DDL等与事务块中的SELECT锁冲突问题。该参数仅8.3.0及以上集群版本支持。
**参数类型：**USERSET
**取值范围：**布尔型
- on表示开启。SELECT语句在语句执行结束后释放一级锁，不会等事务提交才进行释放。
- off表示关闭。
**默认值：**off
#### vacuum_full_interruptible
**参数说明：**通过该参数控制VACUUM FULL语句给其它语句的让锁行为。该参数仅9.1.0.200及以上集群版本支持。
**参数类型：**USERSET
**取值范围：**布尔型
- on表示开启。当VACUUM FULL阻塞其它语句时，VACUUM FULL会中断执行，给其它语句让锁。
- off表示关闭。当VACUUM FULL阻塞其它语句时，VACUUM FULL不会中断执行，其它语句需要等待VACUUM FULL执行完毕放锁后才能执行。
**默认值：**off
