[英]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.