我正在处理多处理的应用程序,每个进程有时会执行以下代码:
db_cursor.execute("SELECT MAX(id) FROM prqueue;")
for record in db_cursor.fetchall():
if record[0]:
db_cursor.execute("DELETE FROM prqueue WHERE id='%s'" % record[0]);
db_connector.commit()
我面临以下问题:可能存在这样的情况,即两个进程采用相同的最大值,并且都尝试删除此值。在我的申请环境中,这种情况是不可接受的,每个值只能由一个过程获取(和删除)。
我怎样才能做到这一点?在获取最大值并删除绝对必要时是否锁定表,或者还有另一种很好的方法可以做到这一点吗?
谢谢。
答案 0 :(得分:2)
考虑使用GET_LOCK()
;
选择特定于要锁定的操作的名称。例如'prqueue_max_del'
。
调用SELECT GET_LOCK('prqueue_max_del',30)
锁定名称'prqueue_max_del'
..如果名称可用,它将返回1并设置锁定;如果30秒后锁定不可用,则返回0(第二个参数是超时)。
完成后使用SELECT RELEASE_LOCK('prqueue_max_del')
。
您必须在每个事务中使用相同的名称,并在事务中再次调用GET_LOCK()
将释放先前设置的锁定。
当心;由于只有抽象名称被锁定,所以不使用此方法和抽象名称的所有其他进程将能够独立地破坏您的表。