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

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

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

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

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

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

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