1

我正在学习 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);

我创建了两个用户。用户 1 下一步:

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;

用户 1 选择:

select * from locktest where id = 3;

ID = 3,验证 = 7

所以,我的问题是为什么 user2 可以更新表,不应该被 user1 锁定?为什么在最后一次从 user1 中选择它得到更新的值,不应该根据可重复的读取隔离级别保持一致?

4

1 回答 1

1

你需要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;
于 2012-09-24T07:26:59.600 回答