【MySQL】事务隔离级别-小学

2020-08-21  本文已影响0人  Michael_abc

事务的基本要素

MySQL的支持

MySQL只在InnoDB中支持事务

四种隔离级别

隔离说明

隔离级别 脏读 不可重复度 幻读
读未提交(read-uncommitted)
读已提交(read-committed)
可重复读(repeatable-read)
可串行化(serializable)

实验

环境:Win7+MySQL5.7

mysql> desc test;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.09 sec)
mysql> SELECT * FROM test;
+----+-------------------+
| id | name              |
+----+-------------------+
|  1 | asdasd123123adasd |
+----+-------------------+
1 row in set (0.00 sec)

读未提交

事务A

Query OK, 0 rows affected (0.00 sec)
mysql> select * from test where id =1;
+----+-------------------+
| id | name              |
+----+-------------------+
|  1 | asdasd123123adasd |
+----+-------------------+
1 row in set (0.00 sec)

事务B

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update test set name="test_b" where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

事务A

mysql> select * from test where id = 1;
+----+--------+
| id | name   |
+----+--------+
|  1 | test_b |
+----+--------+
1 row in set (0.00 sec)

结论

读后提交

事务A

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test where id = 1;
+----+-------------------+
| id | name              |
+----+-------------------+
|  1 | asdasd123123adasd |
+----+-------------------+
1 row in set (0.00 sec)

事务B

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update test set name="test_b" where id = 1;
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0

事务A

mysql> select * from test where id = 1;
+----+-------------------+
| id | name              |
+----+-------------------+
|  1 | asdasd123123adasd |
+----+-------------------+
1 row in set (0.00 sec)

事务B

mysql> commit;
Query OK, 0 rows affected (0.07 sec)

事务A

mysql> select * from test where id = 1;
+----+--------+
| id | name   |
+----+--------+
|  1 | test_b |
+----+--------+
1 row in set (0.00 sec)

结论

可重复读

事务A

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test where id = 1;
+----+--------+
| id | name   |
+----+--------+
|  1 | test_a |
+----+--------+
1 row in set (0.00 sec)

事务B

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update test set name="test_b" where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

事务A

mysql> select * from test where id = 1;
+----+--------+
| id | name   |
+----+--------+
|  1 | test_a |
+----+--------+
1 row in set (0.00 sec)

事务B

mysql> commit;
Query OK, 0 rows affected (0.06 sec)

事务A

mysql> select * from test where id = 1;
+----+--------+
| id | name   |
+----+--------+
|  1 | test_a |
+----+--------+
1 row in set (0.00 sec)

结论

幻读问题


image.png

上图能出现幻读

总结

隔离级别中没有试验系列化,个人觉着意义不大,上述试验能说明,隔离级别已经能深刻的说明问题,加油

上一篇 下一篇

猜你喜欢

热点阅读