处理redshift中的锁

时间:2017-02-27 14:48:11

标签: amazon-redshift database-deadlocks

我有一个python脚本,在Redshift中执行多个sql脚本(一个接一个)。可以多次查询这些sql脚本中的某些表。对于前者表t1可以在一个脚本中选择,可以在另一个脚本中删除/重新创建。整个过程在一个事务中运行。现在,有时,我发现死锁检测错误,整个事务被回滚。如果表上存在死锁,我想等待表释放,然后重试sql执行。对于其他类型的错误,我想回滚该事务。从文档中看,表锁在事务结束前才会释放。我想实现所有或没有数据更改(这是通过使用事务完成),但也想要处理死锁。关于如何实现这一点的任何建议?

1 个答案:

答案 0 :(得分:0)

我将使用重试循环在一个事务中执行您所引用的所有SQL。下面是我用来处理并发问题和重试的逻辑(简称为伪代码)。我没有系统无限期地等待释放锁。相反,我会在应用程序中通过重试来处理它。

begin transaction
while not successful and count < 5
    try 
        execute sql
        commit
    except
        if error code is '40P01' or '55P03'
            # Deadlock or lock not available
            sleep a random time (200 ms to 1 sec) * number of retries
        else if error code is '40001' or '25P02'
            # "In failed sql transaction" or serialized transaction failure
            rollback
            sleep a random time (200 ms to 1 sec) * number of retries
            begin transaction
        else if error message is 'There is no active transaction'
            sleep a random time (200 ms to 1 sec) * number of retries
            begin transaction
    increment count

关键组件正在捕获每个type of error,知道哪些情况需要回滚,并且拥有exponential backoff for retries

相关问题