首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyMySQL是否支持SELECT...FOR更新?

问PyMySQL是否支持SELECT...FOR更新?
EN

Stack Overflow用户
提问于 2015-07-29 10:51:59
回答 1查看 498关注 0票数 5

访问MySQL数据库的python包PyMySQL似乎不支持SELECT ...用于更新。

在下面的代码中,我使用SELECT...FOR UPDATE读取函数f()中的some_table,使用UPDATE修改g()中的表,并为每个函数派生50个线程。

我预计会发生死锁,因为SELECT...FOR更新应该会阻止g产生的线程,但实际上并没有发生死锁。有人能解释一下原因吗?

代码语言:javascript
复制
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。提前谢谢你。

EN

回答 1

Stack Overflow用户

发布于 2021-01-02 21:28:07

PyMySQL确实支持

但是您需要使用connection.begin()启动事务

下面是一个例子:

代码语言:javascript
复制
connection= pymysql.connect("localhost", "tester", "pwd","testDB")
connection.begin()
cursor = db.cursor()
cursor.execute("SELECT * FROM some_table FOR UPDATE")

表/行(取决于您的select查询)现在处于locked状态。只有当前连接才能进行更改。

要释放锁定,请执行以下操作。你可以的,

  1. commit the change(如果有)

(保存更改)

代码语言:javascript
复制
connection.commit()

  1. close the connection

代码语言:javascript
复制
connection.close()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31690478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档