多线程应用程序 + IntegrityError

1 投票
1 回答
834 浏览
提问于 2025-04-15 13:18

我有一个用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 个回答

2

我想确认一下,你是不是在用字符串作为主键,如果我理解得没错的话?

AttributeError: 'NoneType' object has no attribute 'cursor'

这意味着你的某段Python代码出错了。你有没有试过用不同版本的Django,或者在Django的跟踪系统里查找一下你的错误?如果你用的是开发版本,遇到一些bug其实是挺常见的。

另外,你也可以尝试用多个进程来运行Django,而不是用多个线程,如果这样可行的话。

不过,你可能还是想弄清楚为什么会出现重复请求,这样可能会发现其他的bug。

撰写回答