更新时间:2024-12-06 GMT+08:00
分享

锁管理

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语句,优先执行。
  • 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及以上集群版本支持)

默认值:none

  • 为了给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是否可以被中断。该参数仅8.2.1、9.1.0.200及以上集群版本支持。

参数类型:USERSET

取值范围:布尔型

  • on表示开启,即事务块中的select可以被中断。
  • off表示关闭,即事务块中的select不可以被中断。

默认值:on

  • 本参数用于控制处于事务块中的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

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

取值范围:布尔型

  • on表示开启。
  • off表示关闭。

    默认值:off

    开启分布式死锁检测功能模块后若出现分布式死锁场景,预期会在一定时间内检测到后并做自动解锁,挑选最新事务进行cancel,用户会收到报错"cancelled by global deadlock detector"。

global_deadlock_detector_period

参数说明:分布式死锁检测周期间隔,该参数仅8.3.0及以上集群版本支持。

参数类型:SIGHUP

取值范围:整型,1 ~ INT_MAX,单位为秒(s)。

默认值:5s

vacuum_full_interruptible

参数说明:通过该参数控制VACUUM FULL语句给其它语句的让锁行为。该参数仅9.1.0.200及以上集群版本支持。

参数类型:USERSET

取值范围:布尔型

  • on表示开启。当VACUUM FULL阻塞其它语句时,VACUUM FULL会中断执行,给其它语句让锁。
  • off表示关闭。当VACUUM FULL阻塞其它语句时,VACUUM FULL不会中断执行,其它语句需要等待VACUUM FULL执行完毕放锁后才能执行。

默认值:off

forbid_interrupt_vacuum_full_appnames

参数说明:当vacuum_full_interruptible为on时,通过该参数控制VACUUM FULL语句给其它语句让锁的范围。当下发语句的应用名包含在参数指定的列表中时,即使vacuum_full_interruptible为on,VACUUM FULL也不会给该语句让锁。该参数仅9.1.0.200及以上集群版本支持。

参数类型:SIGHUP

取值范围:字符串

默认值:CalculateSpaceInfo,OM,gs_roach

  • 配置多个应用名时,相邻名称用逗号隔开,例如:forbid_interrupt_vacuum_full_appnames='CalculateSpaceInfo,OM,gs_roach';
  • 应用名只能包含字母、数字和下划线,不能包含空格、引号等特殊字符。
  • 应用名大小写不敏感,即om和OM视为相同的应用名。
  • 当vacuum_full_interruptible为off时,VACUUM FULL不会给任何语句让锁,无论下发语句的应用名是否包含在参数指定的列表中。

相关文档