多线程应用程序 + IntegrityError
我有一个用Python写的多线程应用程序,搭配Postgres数据库。我在用Django的ORM(对象关系映射)来保存数据到Postgres。
我有同时进行的保存操作。有时候,两个线程会尝试用相同的主键进行保存,这就会出现问题。
Postgres的日志显示:
错误:重复的键值违反了唯一约束“store_pkey”。
语句:插入到“store”表中(“store_id”,“address”)值为(E'HAN277', E'101 Ocean Street')
代码:
在代码中,我遇到了一个完整性错误(IntegrityError)。我尝试了不同的方法来处理这个问题。
a.
尝试:
a.save()
except IntegrityError:
pass
这样做导致了内部错误(InternalError)。
b. 我尝试进行事务回滚,但不太确定……据我了解,你需要区分保存调用才能进行事务处理。
sid = transaction.savepoint()
try:
row.save()
except IntegrityError, e:
transaction.savepoint_rollback(sid)
pass
transaction.commit()
第一个保存点失败,出现了
属性错误(AttributeError):'NoneType'对象没有'cursor'属性。
a. 我在某处读到Django并不是100%线程安全的。这在我的使用场景中算不算一个好选择?我之前已经在其他应用中使用了Django,并且需要一个ORM……所以我自然选择了Django。
b. 如何处理这种情况……有什么建议吗?
谢谢,祝好,
Ramya
1 个回答
我想确认一下,你是不是在用字符串作为主键,如果我理解得没错的话?
AttributeError: 'NoneType' object has no attribute 'cursor'
这意味着你的某段Python代码出错了。你有没有试过用不同版本的Django,或者在Django的跟踪系统里查找一下你的错误?如果你用的是开发版本,遇到一些bug其实是挺常见的。
另外,你也可以尝试用多个进程来运行Django,而不是用多个线程,如果这样可行的话。
不过,你可能还是想弄清楚为什么会出现重复请求,这样可能会发现其他的bug。