Greenplum - 如何处理死锁

时间:2017-05-17 06:13:35

标签: sql-server greenplum hawq

尝试从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

输出:

IT包括

  1. 用greenplum语法转换提到的sql事务(retry和try / catch)块。

  2. 由于进程ID不断变化,在进入事务时要避免使用硬编码值。

  3. 3.另外,我试图理解这个错误属于我们用greenplum编写的SQL SERVER OR事务。

    talend中的数据流是:

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

    对此有任何帮助将不胜感激?

1 个答案:

答案 0 :(得分:1)

您无法在Greenplum的交易中开始或结束交易。它会自动提交或自动回滚。

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

重试: - 标签重试 BEGIN

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