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