MySQL事务隔离如何工作?

时间:2013-04-25 03:53:46

标签: mysql sql mysqli innodb

当我从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)

事情是我希望事务B等到事务A提交但它没有发生。有人请告诉我如何应用这个以及它如何工作* (我可能完全错了)< / EM> *

2 个答案:

答案 0 :(得分:0)

由于交易A显示:

... Changed: 0 ...

记录已将lead_time设置为2,因此UPDATE未更改任何内容,而事务B只看到原始值。

答案 1 :(得分:0)

可重复读取适用于单个事务。它表示您可以在交易中随意阅读值,您将获得相同的答案。此外,无法确定哪个事务首先启动,A或B.此外,事务可以随时中断,另一个事务运行或继续。您的示例并不反映现实,因为您运行(在命令行上)首先完成,然后B完成。这是序列化。