mysql事务 select会自动加锁吗

mysql事务 select会自动加锁吗

mysql事务 select会自动加锁吗?

总结:mysql事务select 只是进行了隔离,保证数据的一致性,并没有加锁,如果要加锁可以用for update。

验证下:

新建一张表user 添加两个字段,id,name,随便添加几条数据。

打开一个mysql会话(窗口1)

执行如下语句

begin;
select * from user where id=1;

新开窗口2执行更新操作

update user set name='rain' where id=1;

可以成功更新但是窗口1中的事务读取到的还是以前的数据,从而说明第一个窗口的事务里的select并没有锁,但是具有隔离性并没有读取到窗口2里面更新后的数据。

下面回到第一个窗口1将select语句锁住

select * from user where id=1 for update;

再回到窗口2进行更新操作,发现导致了mysql阻塞,更新失败,从而说明窗口1的select被锁住。

当窗口1的事务提交后,窗口2的update执行成功。

One thought on “mysql事务 select会自动加锁吗

  1. 嘛,主要还是mysql的默认隔离级别:RR。事务开启时读操作的话 MMVC 并不会锁住当前行,而是开了一个版本,如果要强制加锁的话就得使用 lock in share mode / for update 了

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据