cx_Oracle python 多进程环境中的删除语句
cx_Oracle python delete statements in multiprocess environment
我正在使用 python cx_Oracle 和多处理。我正在旋转 8 个进程以从表链中删除数据。 8个进程中的delete语句都是一样的。但他们删除的数据是相互排斥的。
每个进程创建自己的数据库连接运行并提交删除语句。
目前使用此设置我遇到错误
ORA-00060: deadlock detected while waiting for resource
有什么办法可以避免这个错误吗?
在不提供有关您用于执行删除的代码和 table 定义的附加信息的情况下,我只能提供一般性建议:
- 查看table上设置的索引;如果您在不使用索引的情况下删除行,您将需要锁定整个 table 而不是仅锁定被删除的行
- 查看引用table的外键;通过删除这些行,也可以在子 table 上获得锁;如果这些列上没有索引,您可能会锁定整个 table
- 检查 dba_lock table 以查看实际持有的锁
- 检查你的代码;只有当进程 A 获得了一些锁,进程 B 获得了其他一些锁,然后想要进程 A 获得的锁,然后进程 A 想要获得进程 B 持有的锁时,才会发生死锁;它也不必只有两个过程;由多个进程持有的整个锁链可能是罪魁祸首
我正在使用 python cx_Oracle 和多处理。我正在旋转 8 个进程以从表链中删除数据。 8个进程中的delete语句都是一样的。但他们删除的数据是相互排斥的。 每个进程创建自己的数据库连接运行并提交删除语句。 目前使用此设置我遇到错误
ORA-00060: deadlock detected while waiting for resource
有什么办法可以避免这个错误吗?
在不提供有关您用于执行删除的代码和 table 定义的附加信息的情况下,我只能提供一般性建议:
- 查看table上设置的索引;如果您在不使用索引的情况下删除行,您将需要锁定整个 table 而不是仅锁定被删除的行
- 查看引用table的外键;通过删除这些行,也可以在子 table 上获得锁;如果这些列上没有索引,您可能会锁定整个 table
- 检查 dba_lock table 以查看实际持有的锁
- 检查你的代码;只有当进程 A 获得了一些锁,进程 B 获得了其他一些锁,然后想要进程 A 获得的锁,然后进程 A 想要获得进程 B 持有的锁时,才会发生死锁;它也不必只有两个过程;由多个进程持有的整个锁链可能是罪魁祸首