PyMySQL,一个访问MySQL数据库的python包,似乎不支持SELECT ... FOR UPDATE。
在下面的代码中,我使用SELECT ... FOR UPDATE读取函数f()中的some_table,使用UPDATE修改g()中的表,并为每个函数生成50个线程。
我预计会发生死锁,因为SELECT ... FOR UPDATE应该阻止g生成的线程。但实际上并没有发生僵局。有人可以解释原因吗?
from threading import Thread
import pymysql
def f():
db = pymysql.connect("localhost", "tester","pwd", "testDB")
cur = db.cursor()
sql = "SELECT * FROM some_table FOR UPDATE"
try:
cur.execute(sql)
except:
print("Exception in select")
def g():
db = pymysql.connect("localhost", "tester", "pwd","testDB")
cur = db.cursor()
sql = "UPDATE some_table SET val=20 WHERE id=2"
try:
cur.execute(sql)
db.commit()
except:
print("Exception in update")
db.rollback()
for _ in range(50):
Thread(target=f, args=()).start()
Thread(target=g, args=()).start()
我使用的是Python 3.4和PyMySQL 0.6.6。提前谢谢。
答案 0 :(得分:1)
PyMySQL 确实支持 SELECT ... FOR UPDATE
但是您需要使用 connection.begin()
这是一个例子:
connection= pymysql.connect("localhost", "tester", "pwd","testDB")
connection.begin()
cursor = db.cursor()
cursor.execute("SELECT * FROM some_table FOR UPDATE")
表/行(取决于您选择的查询)现在处于锁定状态。只有当前连接可以进行更改。
解除锁定。你可以,
connection.commit()
connection.close()