访问MySQL数据库的python包PyMySQL似乎不支持SELECT ...用于更新。
在下面的代码中,我使用SELECT...FOR UPDATE读取函数f()中的some_table,使用UPDATE修改g()中的表,并为每个函数派生50个线程。
我预计会发生死锁,因为SELECT...FOR更新应该会阻止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()我使用的是Python3.4和PyMySQL 0.6.6。提前谢谢你。
发布于 2021-01-02 21:28:07
PyMySQL确实支持
但是您需要使用connection.begin()启动事务
下面是一个例子:
connection= pymysql.connect("localhost", "tester", "pwd","testDB")
connection.begin()
cursor = db.cursor()
cursor.execute("SELECT * FROM some_table FOR UPDATE")表/行(取决于您的select查询)现在处于locked状态。只有当前连接才能进行更改。
要释放锁定,请执行以下操作。你可以的,
(保存更改)
connection.commit()connection.close()https://stackoverflow.com/questions/31690478
复制相似问题