美文网首页
【MySQL】事务隔离级别-小学

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

作者: Michael_abc | 来源:发表于2020-08-21 17:57 被阅读0次

事务的基本要素

  • 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
  • 一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
  • 隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
  • 持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

MySQL的支持

MySQL只在InnoDB中支持事务

四种隔离级别

  • 未提交读(uncommitted read)
  • 提交后读(committed read)
  • 可重复读(repeatable read)
  • 串行化(serializable read)

隔离说明

隔离级别 脏读 不可重复度 幻读
读未提交(read-uncommitted)
读已提交(read-committed)
可重复读(repeatable-read)
可串行化(serializable)
  • 脏读(duty read):读到没有提交的事务提交的数据
  • 不可重复读(unrepeatable read):在一个事务内,读到的同一条数据可能不一样
  • 幻读(dream read):事务A 按照一定条件进行数据读取, 期间事务B 插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B 新插入的数据 称为幻读

实验

环境: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在事务中两次查询数据不一样
  • 事务B还未提交,事务A的结果已经变化
  • 未提交读是脏读

读后提交

事务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在事务B执行更新语句后查询结果一致
  • 事务A在事务B提交后查询结果改变
  • 提交后读是不可重复读的

可重复读

事务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)

结论

  • 事务A中的查询结果在事务B提交前后都不会变化
  • 可重复读-可重复读

幻读问题


image.png

上图能出现幻读

总结

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

相关文章

  • 聊聊MySQL的隔离级别

    原文:聊聊MySQL的隔离级别 | MySQL隔离级别原理参考:oracle - mysql - 数据库事务隔离级...

  • mysql事务隔离级别的实现原理

    mysql事务隔离级别的实现原理 mysql innodb中的四种事务隔离级别[https://www.jians...

  • MySQL 事务隔离级别解析和实战

    MySQL 事务隔离级别解析和实战 1、MySQL 隔离界别查看 查看回话隔离级别 查看系统隔离级别 2、MySQ...

  • Mysql事务

    1) mysql事务的ACID特性 2)MySQL事务隔离级别

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

    事务的基本要素 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节...

  • mysql隔离级别

    一、MySQL事务隔离级别 mysql默认的事务隔离级别为repeatable-read(可重复读) 1.未提交可...

  • Mac系统mysql设置事务隔离级别

    Mac系统mysql设置事务隔离级别 MySQL数据库事务隔离级别主要有四种: Serializable 串行化,...

  • 数据库事务相关

    事务隔离级别(tx_isolation)mysql 有四级事务隔离级别 每个级别都有字符或数字编号 级别symbo...

  • MYSQL事务

    常用语句 MYSQL事务,锁表 事务控制语句 事务的隔离级别 隔离级别描述产生风险READUNCOMMITTED ...

  • 面试官:说一下MySQL事务隔离级别?

    MySQL 事务隔离级别是为了解决并发事务互相干扰的问题的,MySQL 事务隔离级别总共有以下 4 种: READ...

网友评论

      本文标题:【MySQL】事务隔离级别-小学

      本文链接:https://www.haomeiwen.com/subject/eiemrktx.html