锁管理
在GaussDB(DWS)中,并发执行的事务由于竞争资源可能会导致单机死锁或分布式死锁。本节介绍的参数主要管理事务锁的机制。
deadlock_timeout
参数说明:设置死锁超时检测时间,以毫秒为单位。当申请的锁超过设定值时,系统会检查是否产生了死锁。
- 死锁的检查代价是比较高的,服务器不会在每次等待锁的时候都运行这个过程。在系统运行过程中死锁是不经常出现的,因此在检查死锁前只需等待一个相对较短的时间。增加这个值就减少了无用的死锁检查浪费的时间,但是会减慢真正的死锁错误报告的速度。在一个负载过重的服务器上,用户可能需要增大它。这个值的设置应该超过事务持续时间,这样就可以减少在锁释放之前就开始死锁检查的问题。
- 设置log_lock_waits时,这个选项也决定了在一个日志消息发出关于锁等待以前要等待的时间。当需要调查锁延迟时,请设置比正常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
该参数优先级高于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语句,优先执行,其它DDL语句和select语句保持锁等待状态。
- exchange:表示exchange语句被select语句阻塞时,exchange会中断select语句,优先执行,其它DDL语句和select语句保持锁等待状态。
- truncate,exchange:表示truncate和exchange语句被select语句阻塞时,二者会中断select语句,优先执行。
默认值:none
- 为了给SELECT语句预留响应信号的时间,当前版本中设置的ddl_lock_timeout的值不足1秒时按照1s处理。
- 与高级别的锁冲突(大于1级),不支持并发(比如autoanalyze_mode=normal时,同时SELECT触发了autoanalyze)。
- 该参数支持与单语句中的select或事务块中的select并发,其它版本中仅支持与单语句的select并发。
lockwait_timeout
参数说明:控制单个锁的最长等待时间。当申请的锁等待时间超过设定值时,系统会报错。
参数类型:SUSET
取值范围:整型,0 ~ INT_MAX,单位为毫秒(ms)。
默认值:20min
update_lockwait_timeout
参数说明:允许并发更新参数开启情况下,该参数控制并发更新同一行时单个锁的最长等待时间。当申请的锁等待时间超过设定值时,系统会报错。
参数类型:SUSET
取值范围:整型,0 ~ INT_MAX,单位为毫秒(ms)。
默认值:2min
max_locks_per_transaction
参数说明:控制每个事务能够得到的平均的对象锁的数量。
- 共享的锁表的大小是以假设任意时刻最多只有max_locks_per_transaction*(max_connections+max_prepared_transactions) 个独立的对象需要被锁住为基础进行计算的。不超过设定数量的多个对象可以在任一时刻同时被锁定。当在一个事务里面修改很多不同的表时,可能需要提高这个默认数值。只能在数据库启动的时候设置。
- 增大这个参数可能导致GaussDB(DWS)请求更多的System V共享内存,有可能超过操作系统的缺省配置。
- 当运行备机时,请将此参数设置不小于主机上的值,否则,在备机上查询操作不会被允许。
参数类型:POSTMASTER
取值范围:整型,10 ~ INT_MAX
默认值:256
max_pred_locks_per_transaction
参数说明:控制每个事务允许断定锁的最大数量,是一个平均值。
- 共享的断定锁表的大小是以假设任意时刻最多只有max_pred_locks_per_transaction*(max_connections+max_prepared_transactions) 个独立的对象需要被锁住为基础进行计算的。不超过设定数量的多个对象可以在任一时刻同时被锁定。当在一个事务里面修改很多不同的表时,可能需要提高这个默认数值。只能在服务器启动的时候设置。
- 增大这个参数可能导致GaussDB(DWS)请求更多的System V共享内存,有可能超过操作系统的缺省配置。
参数类型:POSTMASTER
取值范围:整型,10 ~ INT_MAX
默认值:64
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
enable_global_deadlock_detector
参数说明:控制分布式死锁检测功能模块是否开启,该参数仅8.3.0及以上集群版本支持。
参数类型:SIGHUP
取值范围:布尔型
global_deadlock_detector_period
参数说明:分布式死锁检测周期间隔,该参数仅8.3.0及以上集群版本支持。
参数类型:SIGHUP
取值范围:整型,1 ~ INT_MAX,单位为秒(s)。
默认值:5s