Greenplum - 如何处理死锁



当尝试从Greenplum运行SQL事务时。

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事务(重试和尝试/捕获(块。

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

3.另外,我试图理解此错误属于SQL SERVER或我们在Greenplum中编写的事务。

数据流是:

**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

相关内容

  • 没有找到相关文章

最新更新