我在 Postgresql 上遇到了一些错误,这些错误似乎与这种竞争条件有关。
我有一个用 Twisted Python 编写的进程/守护进程。将其描述为网络爬虫的最简单方法是拉取页面、解析链接并记录所看到的内容。由于 HTTP 阻塞,Twisted 运行多个延迟到线程的“并发”进程。
这是比赛条件...
当我遇到 url Shorter 时,会发生以下逻辑:
result= """SELECT * FROM shortened_link WHERE ( url_shortened = %(url)s ) LIMIT 1;"""
if result:
pass
else:
result= """INSERT INTO shortened_link ( url_shortened ..."
一个惊人的数字或 psycopg2.IntegrityError 被提出,因为 url_shortened 上的唯一索引被违反了。
选择/插入实际上确实紧密地一起运行。据我所知,看起来 2 个缩短的链接彼此相邻。
Process A: Select, returns Null
Process B: Select, returns Null
Process A: Insert , success
Process B: Insert , integrity error
任何人都可以提出任何提示/技巧来处理这个问题吗?我想避免显式锁定,因为我知道这会引发一系列其他问题。