Greenplum - 如何处理死锁

Greenplum - How To Handle Deadlock

当尝试 运行 SQL 来自 Greenplum 的交易时。收到此错误。

Transaction (Process ID 52) was deadlocked on lock resources with 
another process and has been chosen as the deadlock victim.
Rerun the transaction.

我们试过了:

在 SQL 服务器上它正在工作但是我们想在 greenplum 上写相同的事务

Transaction A


RETRY: -- Label RETRY
BEGIN TRANSACTION
BEGIN TRY

    truncate table tablename
    WAITFOR DELAY '00:00:05'  -- Wait for 5 ms
    Insert into tablename

    COMMIT TRANSACTION
END TRY
BEGIN CATCH
    PRINT 'Rollback Transaction'
    ROLLBACK TRANSACTION
    IF ERROR_NUMBER() = 1205 -- Deadlock Error Number
    BEGIN
        WAITFOR DELAY '00:00:00.05' -- Wait for 5 ms
        GOTO RETRY -- Go to Label RETRY
    END
END CATCH

输出:

它包括

  1. 提到的 sql 事务(重试和 try/catch )块在 greenplum 语法中的转换。

  2. 由于进程 ID 不断变化,希望在传递到事务时避免硬编码值。

3.Also,我试图了解这个错误属于我们用 greenplum 编写的 SQL 服务器或事务。

talend中的数据流为:

**Read from MS SQL SERVER >> write into hdfs >> load into greenplum** 

如有任何帮助,我们将不胜感激?

您不能在 Greenplum 的交易中开始或结束交易。它自动提交或自动回滚。

多版本并发控制,始终保持数据一致性,并且查询始终在并行机制中按顺序执行。

重试:-- 标签重试 开始

truncate table tablename
select pg_sleep(5) -- Wait for 5 ms
Insert into tablename

RAISE INFO 'Rollback Transaction'

IF ERROR_NUMBER = 1205 -- Deadlock Error Number
THEN 
select pg_sleep(5)  -- Wait for 5 ms
   -- Go to Label RETRY
END