簡體   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