我已经在这方面工作了一段时间,并且互联网上的搜索没有提出解决方案。
我想在访问之前检查另一个进程是否正在访问我的数据库。我有一个列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()
有什么想法吗?
答案 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()