暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GREENPLUM全局死锁检测

开源喵 2021-06-23
2953

Greenplum数据库全局死锁检测器后端进程会收集所有segment上的锁信息,并使用有向算法来检测本地死锁和全局死锁是否存在。该算法使Greenplum数据库放宽对堆表的并发更新和删除限制。(Greenplum数据库仍然在AO CO表上使用表级锁定,对UPDATE, DELETE, 和 SELECT…FOR UPDATE的并发操作进行限制。)

默认情况下,全局死锁检测器是被禁用的,Greenplum数据库以串行方式对堆表执行并发更新和删除操作。可以通过设置配置参数gp_enable_global_deadlock_detector,开启并发更新并让全局死锁检测器检测死锁是否存在。

启用全局死锁检测器后,当启动Greenplum数据库时,master 主机上会自动启动一个后端进程。可以通过 gp_global_deadlock_detector_period配置参数,来设置采集和分析锁等待数据的时间间隔。

如果全局死锁检测器发现了死锁,它会通过取消最新的事务所关联的一个或多个后端进程来避免死锁。

当全局死锁检测器发现了以下事物类型的死锁时,只有一个事务将成功。其他事务将失败,并打印错误指出不允许对同一行进行并发更新。

  • 在同一行堆表的并发事务中,第一个事务是更新操作,下一个事务执行更新或删除,并且查询计划包含一个动作操作符。

  • 堆表的同一分发键上的并发更新事务由Greenplum Database Postgres查询优化器执行

  • 哈希表的同一行上的并发事务更新由GPORCA优化器执行。

Note: Greenplum数据库通过配置参数 deadlock_timeout 指定本地死锁检测的间隔。由于本地死锁检测和全局死锁检测算法的不同,被死锁检测器终止的进程也不同,这取决于本地死锁检测和全局死锁检测哪个先被触发。

Note: 若打开配置参数 lock_timeout ,且将数值设定为小于deadlock_timeout 和 gp_global_deadlock_detector_period,查询会在死锁检测被触发之前就被终止。

用户可以通过自定义函数,pg_dist_wait_status() 查看所有segment上的锁等待信息:哪些事务在等待锁,哪些事务在持有锁,以及事务运行在哪个segment上。pg_dist_wait_status() 的输出如下例所示:

  1. SELECT * FROM pg_dist_wait_status();

  2. segid | waiter_dxid | holder_dxid | holdTillEndXact

  3. -------+-------------+-------------+-----------------

  4. -1|29|28| t

  5. 0|28|26| t

  6. 0|27|29| t

  7. 1|26|27| t

  8. (4 rows)

全局死锁检测器会终止某个事务以打破死锁,并且打印如下的错误信息:

  1. ERROR: canceling statement due to user request:"cancelled by global deadlock detector"



官方锁相关系统参数:


文章转载自开源喵,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论