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);

2 人のユーザーを作成しました。User1 は次に行います。

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

ID = 3、値 = 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、値 = 7

それで、私の質問はなぜuser2がテーブルを更新できるのですか? user1によってロックされるべきではありませんか? そして、 user1からの最後の選択で更新された値を取得するのはなぜですか?

4

1 に答える 1

1

innodbが必要ですか、この回答を参照してください。

User 1分離を確実にするために、SQL操作をトランザクションに囲む必要があります。これは、テスト用の操作を囲むのに十分です。2 つの別々のセッションでコマンドを実行することを忘れないでください。たとえば、MySQL ツールを 2 回開くなど、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 に答える