【发布时间】:2016-07-19 20:03:33
【问题描述】:
我已经研究了一段时间了,在互联网上搜索并没有找到解决方案。
我想在访问数据库之前检查其他进程是否正在访问我的数据库。我有一个列 id 和 state 的表。如果 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()
有什么想法吗?
【问题讨论】:
-
您应该同时阅读stackoverflow.com/questions/10935850/…。根据您的事务隔离,您当前的实现可能会针对竞争条件开放。
-
谢谢,为我提供解决方案。
-
选择更新和更新后,您需要通过提交释放行锁。否则另一个 select for update 将阻塞等待行锁。