【问题标题】:Possible threading issue with pyodbcpyodbc 可能的线程问题
【发布时间】:2016-06-22 12:31:24
【问题描述】:

我有一个现有系统,其中 oracle 数据库由一系列 Python 文件填充元数据。大约有 500 个,当前一次运行一个的方法大约需要一个小时才能完成。

为了减少这个运行时间,我尝试线程化单个文件,同时运行它们,但是我得到了一个错误

pyodbc.IntegrityError: ('23000', '[23000] [Oracle][ODBC][Ora]ORA-00001: unique constraint (DB.PK_TABLE_NAME) violated\n (1) (SQLExecDirectW)')

回溯到以下调用:

File "C:\file.py", line 295, in ExecuteSql
cursor.execute(Sql)

任何人都可以为我解释一下吗?如果随后单独运行引发错误的文件,则似乎不会发生这种情况,这使我怀疑这是一个访问问题,其中两个文件试图一次写入数据库。我希望情况并非如此,因为这可能会完全否决这种方法。

【问题讨论】:

  • 您似乎遇到了标识符冲突。您的 INSERT 是否包含在事务中?您是否在多个线程之间共享单个连接或游标?
  • @FlipperPA 每个线程都有自己的连接。它们没有包含在交易中(这是一种非常复杂的方法,我正在尝试一点一点地改进)

标签: python oracle python-2.7 pyodbc


【解决方案1】:

我最终意识到问题出在提交给数据库的 SQL 的构建方式上。

表的 ID 由“GetNext()”函数生成,该函数从表中获取当前最大 ID 并将其加一。当同时运行多个文件并尝试使用基于此生成的相同 ID 时,这将失败。

【讨论】:

    猜你喜欢
    • 2010-09-19
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多