Python在执行SQL更新查询时卡住了

Python在执行SQL更新查询时卡住了,python,sql,Python,Sql,我的python脚本在游标执行时卡住了,我很难找出原因 db = cx_Oracle.connect('user/password@user') cursor = db.cursor() for i in range(1, 10): insert_data = """ update products set prd_stock_holder = '~',prd_prod_quality = 'FREE' where PRD_PRI_ID = (select prd_p

我的python脚本在游标执行时卡住了,我很难找出原因

db = cx_Oracle.connect('user/password@user')
cursor = db.cursor()

for i in range(1, 10):
    insert_data = """
    update products set prd_stock_holder = '~',prd_prod_quality = 'FREE' 
    where PRD_PRI_ID = (select prd_pri_id from products join PRODUCT_INFOS
        on prd_pri_id = pri_id
            where PRI_code = '%s')""" %i

    cursor.execute(insert_data) # stuck here

    print "product %s updated" %i # never printed

db.commit()

原因可能是Oracle RDBMS上的锁。您可以尝试检查会话是否在等待资源时被锁定(例如)


请记住,锁可能连接到db决定应用的执行计划。通过重写更新查询,您可能会从更薄的锁获取中获益。

我在插入MySQL数据库时遇到了一个类似的问题。 在循环中移动db.commit()解决了我的问题

db = cx_Oracle.connect('user/password@user')
cursor = db.cursor()

for i in range(1, 10):
    insert_data = """
    update products set prd_stock_holder = '~',prd_prod_quality = 'FREE' 
    where PRD_PRI_ID = (select prd_pri_id from products join PRODUCT_INFOS
        on prd_pri_id = pri_id
            where PRI_code = '%s')""" %i

    cursor.execute(insert_data) # stuck here
    db.commit()
    print "product %s updated" %i # never printed

你们的桌子有多大?可能需要很长的处理时间。它在sql*plus或您的Oracle客户端中是如何工作的?在每次执行
后尝试提交(即循环中缩进
db.commit
)。实际上,根据链接中的指示,我的会话已锁定。那么您认为该形式的查询本身会导致该问题吗?有执行计划会很有用。例如,您可能会发现获取所有元组
(id,stuff\u you\u need\u生成\u update\u value…)
,然后按id批量更新在锁定方面可能更具选择性。非常感谢,将select和update拆分为不同的查询有助于解决问题,但语义会发生变化:如果循环失败,您最终会进行部分提交,这在原始代码片段中是不可能的。