【发布时间】:2016-04-26 23:31:57
【问题描述】:
我有一个非常大的 Redshift 数据库,其中包含数十亿行 HTTP 请求数据。
我有一个名为requests 的表,其中包含一些重要字段:
ip_addresscitystatecountry
我有一个 Python 进程每天运行一次,它会抓取所有尚未进行地理编码的不同行(没有任何城市/州/国家信息),然后尝试通过 Google 的地理编码 API 对每个 IP 地址进行地理编码。
这个过程(伪代码)如下所示:
for ip_address in ips_to_geocode:
country, state, city = geocode_ip_address(ip_address)
execute_transaction('''
UPDATE requests
SET ip_country = %s, ip_state = %s, ip_city = %s
WHERE ip_address = %s
''')
运行此代码时,我经常收到如下错误:
psycopg2.InternalError: 1023
DETAIL: Serializable isolation violation on table - 108263, transactions forming the cycle are: 647671, 647682 (pid:23880)
我假设这是因为我有其他进程不断将 HTTP 请求记录到我的表中,所以当我尝试执行我的 UPDATE 语句时,它无法选择具有 ip 地址的 all 行我想更新。
我的问题是:我该怎么做才能以一种不会经常失败的理智方式更新这些记录?
【问题讨论】:
标签: sql amazon-redshift