繁体   English   中英

sql事务,为什么用户可以更新

[英]sql transactions, why user can update

我正在学习mysql中的事务。 我无法理解行为。 我的数据库的隔离级别是可重复读取的。 数据库模式:

creade database my_db;
use my_db;
create table locktest(
    id integer,
    val integer,
    primary key (id)
);
insert into locktest (id, val) values (3,6);

我创建了两个用户。 User1接下来要做的是:

start transaction;
select * from locktest where id = 3;

得到ID = 3,VAL = 6;

然后,user2更新:

update locktest set val = 7 where id = 3;
select * from locktest where id = 3;

结果是id = 3,val = 7;

user1选择:

select * from locktest where id = 3;

id = 3,val = 7

因此,我的问题是为什么user2可以更新表,而不应该被user1锁定? 以及为什么在user1的最后一次选择中它会获取更新的值,根据可重复的读取隔离级别,它是否不一致?

您是否需要innodb,请参见此答案

您应该将SQL操作包含在事务中以确保隔离,该操作足以将User 1操作包含在测试中。 记住要在两个单独的会话中执行命令,例如两次打开MySQL工具,您不能使用phpmyadmin对此进行测试:

User 1:                                         User 2:
SET SESSION TRANSACTION 
 ISOLATION LEVEL
 REPEATABLE READ;

START TRANSACTION;                              START TRANSACTION;

select * 
 from locktest where id = 3;

                                                update locktest 
                                                  set val = 7 where id = 3;
                                                select * from locktest 
                                                  where id = 3;

select * 
 from locktest where id = 3;

--Result must be the same than
--previus query.

COMMIT;

                                                COMMIT;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM