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