Python挂起MySQL更新

时间:2016-03-31 11:31:28

标签: python mysql cursor

我已经在这方面工作了一段时间,并且互联网上的搜索没有提出解决方案。

我想在访问之前检查另一个进程是否正在访问我的数据库。我有一个列id和状态的表。如果state为1,那么我想将其更改为0并继续访问,否则我想不管它。以下是我的代码,我无法理解为什么它不会工作但是每次都在最后一行挂起cursor.execute(set_lock)

get_lock = "SELECT state FROM running WHERE id=1"
cursor.execute(get_lock)
result = cursor.fetchall()
if(result[0][0]):
    set_lock = "UPDATE running SET state=0 WHERE id=1"
    cursor.execute(set_lock)

我很确定它与光标的重复使用有关,但我不明白为什么它应该是一个问题,我已经成功完成了它。任何帮助你都很棒。

干杯

我以为我已经解决了问题,但修复程序很复杂,似乎可以开始使用,但后来开始返回错误的状态。在PHPMyAdmin中运行MySQL语句,它返回1,但是在打印结果时它返回0,因此跳过了if语句的内容。

cursor.execute("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;")
get_lock = "SELECT state FROM running WHERE id=1;"
cursor.execute(get_lock)
result = cursor.fetchall()
if(result[0][0]):
    set_lock = "UPDATE running SET state=0 WHERE id=1;" //Lock
    cursor.execute(set_lock)
    cursor.execute("COMMIT;")

    ---- DO WHAT I NEED TO DO ----

    set_lock = "UPDATE running SET state=1 WHERE id=1;" //Unlock
    cursor.execute(set_lock)
    cursor.execute("COMMIT;")

cursor.execute("SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;")
cursor.close()

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

通过以下Ilja's评论的引导来找到解决方案。

get_lock = "SELECT state FROM running WHERE id=1 FOR UPDATE;"
cursor.execute(get_lock)
result = cursor.fetchall()
if(result[0][0]):
    set_lock = "UPDATE running SET state=0 WHERE id=1;"
    cursor.execute(set_lock)
    cursor.execute("COMMIT;")

最初由于SELECT声明中的拼写错误而无法正常工作。最后一个陈述也很重要cursor.execute("COMMIT;")

阅读此question后,我似乎有了一个解决方案,但其行为却是断断续续的。

cursor.execute("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;")
get_lock = "SELECT state FROM running WHERE id=1;"
cursor.execute(get_lock)
result = cursor.fetchall()
if(result[0][0]):
    set_lock = "UPDATE running SET state=0 WHERE id=1;" //Lock
    cursor.execute(set_lock)
    cursor.execute("COMMIT;")

    ---- DO WHAT I NEED TO DO ----

    set_lock = "UPDATE running SET state=1 WHERE id=1;" //Unlock
    cursor.execute(set_lock)
    cursor.execute("COMMIT;")

cursor.execute("SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;")
cursor.close()