Eddie780
2021-07-20 13:07
采纳率: 100%
浏览 175
已结题

pymysql中执行事务时,使用select …… for update为何无法锁行?

conn = pymysql.connect(...)
lsc = conn.cursor()
lsc.execute("select * from user where uid=%s for update;", (101, ))
lsallrow = lsc.fetchone()
time.sleep(10)
conn.commit()

想写一个事务字段uid是user表的主键,数据库引擎是InnoDB
根据之前学校里学的理解:for update之后,uid=101这行应该是锁上了,无法被编辑。
但在sleep(10)期间,使用另一个终端窗口执行更改用户101的money字段居然可以成功。
那这个for update锁行有什么意义?

img

  • 收藏

5条回答 默认 最新

  • 吃肉的小馒头 2021-07-20 14:10
    已采纳

    sql语句中uid为什么写成元组形式呢,试过直接写成uid=101 这种的能查询出结果么? 看设计的uid是int类型

    已采纳该答案
    打赏 评论
  • robot8me 2021-07-20 13:34

    加上conn.begin()试试;
    for update 仅适用于InnoDB,并且必须开启事务,在begin与commit之间才生效。

    打赏 评论
  • li.siyuan 2021-07-20 13:36

    你把 for update后边的分号去掉
    加上conn.begin()
    再试试?

    打赏 评论
  • 雨夹雪 2021-07-20 14:56

    还要设置事务自动提交为手动吧,这样
    try:
    conn.autocommit(0)
    conn.begin()

    打赏 评论
  • 王大师王文峰 2021-07-20 17:52

    如果查询条件用了索引/主键,那么select ..... for update就会进行行锁。

    如果是普通字段(没有索引/主键),那么select ..... for update就会进行锁表

    打赏 评论

相关推荐 更多相似问题