0

herehereから読み取ったように、トランザクションレベルが REPEATABLE-READ の場合、他のトランザクションはこのトランザクションによってアクセスされているデータを読み取ることができません。しかし、テスト中にこれを見つけました。(MySQL サーバーのバージョン: 5.0.21-community-nt /innodb エンジン) .

トランザクション A:

mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ | 
+-----------------+
1 row in set (0.00 sec)

mysql> SET autocommit = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> UPDATE manufacturer
    -> SET lead_time = 22
    -> WHERE mcode = 'ACL';
Query OK, 1 rows affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

取引B

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM Manufacturer ;
+-------+------------+-----------+
| mcode | mname      | lead_time |
+-------+------------+-----------+
| ACL   | ACL Cables |         2 | 
| HAY   | Haycarb    |         4 | 
| HYL   | Hayleys    |         5 | 
+-------+------------+-----------+
3 rows in set (0.00 sec)

問題は、トランザクション A がコミットされるまでトランザクション B が待機することを期待していたのですが、それは実現しませんでし

4

2 に答える 2

0

トランザクション A が示すので:

... Changed: 0 ...

レコードはすでに にlead_time設定されて2いるため、UPDATE何も変更されず、トランザクション B は単に元の値を確認します。

于 2013-04-25T04:53:59.873 に答える
0

Repeatable Read は、1 つのトランザクション内で適用されます。トランザクション内で何度でも値を読み取ることができ、同じ答えが得られると書かれています。また、A と B のどちらのトランザクションが最初に開始されるかを判断する方法もありません。さらに、トランザクションはいつでも中断され、別のトランザクションが実行または継続される可能性があります。あなたの例は、(コマンドラインで) A を最初に実行し、次に B を実行して完了するという現実を反映していません。これがシリアル化です。

于 2013-04-25T05:27:07.193 に答える