分布式数仓应用场景中,我们经常遇到数据库系统 hang 住的问题,所谓 hang 是指虽然数据库系统还在运行,但部分或全部业务无法正常执行。hang 问题的原因有很多,其中以分布式死锁最为常见,本次主要分享在碰到死锁时,如何快速地解决死锁问题。
GaussDB(DWS) 作为分布式数仓,通过锁机制来实行并发控制,因此也存在产生分布式死锁的可能。虽然分布式死锁无法避免,但幸运的是其提供了多种系统视图,能够保证在分布式死锁发生之后,快速地对死锁进行定位。
本文主要介绍了在 GaussDB(DWS) 中,如何通过 SQL 语句,对分布式死锁进行检测和恢复。本文介绍的方法大致分为 4 步:
1. 收集各节点的锁信息。
2. 构建等待关系。
3. 检测循环等待。
4. 中止事务以消除死锁。
本文介绍的方法使用简单,门槛低,可以确保在分布式死锁发生之后,快速解决问题,恢复业务。
通过 SQL 语句进行分布式死锁的检测与消除 分布式死锁和单节点死锁的比较 单节点死锁单节点死锁是指,死锁中的所有锁等待信息来自同一个节点,例如:
-- 事务 transaction1 -- 所在节点:CN1 BEGIN; TRUNCATE t1; EXECUTE DIRECT ON(DN1) 'SELECT * FROM t2'; COMMIT; -- 事务 transaction2 -- 所在节点:CN1 BEGIN; TRUNCATE t2; EXECUTE DIRECT ON(DN2) 'SELECT * FROM t1'; COMMIT;