MySQL事务及隔离级别详解

                                          作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.MySQL的基本架构
  MySQL的基本架构可以分为三块,即连接池,核心功能层,存储引擎层。
1>.连接池 (线程处理工具)
  主要功能是与用户请求建立连接。第一层向用户响应请求的数据,这个层次不是MySQL服务独有的,其实大多数C/S架构的工作软件基本上都是这种工作模式,只不过在处理连接池的内存,进程的释放等管理关系上mysql可能有着自己独特的方式。
  我们知道MySQL是单进程多线程的模型,MySQL的线程有很多种类型,比方说:负责和用户建立连接的叫做连接线程,把缓存中的数据同步到磁盘中去的叫做刷新线程,甚至于不同的存储引擎还维持着多个后台线程等等。那么一个MySQL服务器和客户端同时能建立多少个连接呢?mysql管理连接是通过线程池来实现的,其实很多基于线程机制的连接管理器都基于线程池(thread pool)来管理的。一个线程池所拥有的线程数是有限的,所以我们MySQL在启动的时候会事先创建一个线程池,比如在创建了100个线程,那么来一个客户端连接就给它分配一个线程,当连接的总数到达150(超过提前创建的100个线程数量了)时,MySQL会先响应前100个线程,而将后面的50个请求放在一个队列中,然他们在这个队列中进行排队,一旦前面的100个线程中的任意一个用户退出了,就会空出来一个线程,这个空出来的线程不会被销毁,而是把这个线程给它清理一下,还原到最初的样子,再去响应在队列中排队的50个线程的任何一个。所以用户的连接线程在线程池的管理模式中是不会被销毁的,一般会实现线程重用,从而避免了线程的重建和释放。
  MySQL的客户端和服务器进行连接是基于msyql协议的,MySQL支持文本协议和二进制的协议。只不过二进制的协议高效一些。不管是基于文本还是二进制协议mysql的发送数据默认为明文(也就是我们用一个解码器就可以将数据直接读取出来,尽管你用了二进制编码或是其他文本格式编码),可以使用ssl加密数据。
 
2>.核心功能层
  主要功能是查询解析,分析,优化,缓存,内置函数(BIF),触发器,视图等跨存储引擎的功能,你也可以说MySQL的主要功能都在这一层提供。第二次我们也可以叫它为MySQL的核心服务层。
 
3>.存储引擎层
  主要功能是对数据的存入和提取。我们知道MySQL是插件式存储引擎,而存储引擎又是表级别的概念,我们创建任何一张表的时候我们都可以指定它的存储引擎,在同一个库中的多个表可以使用不同的存储引擎,所以我们说存储引擎对MySQL来讲是一个非常灵活的机制。
 
二.MySQL锁
  MySQL的并发访问控制是基于锁来实现。
1>.执行操作时施加的锁的模式有以下两种:
  读锁:特点是用户在读的时候施加的锁,为防止别人修改,但是用户可以读,即可以多个用户可以同时对一张表进行读取操作但不能修改数据该表的内容,因此读锁还被称为共享锁。在做数据备份时要建议手动施加读锁。
  写锁:特点是当对一个表做修改操作时,其他用户不能对这张表进行读同时也不能写哟。因此写锁也被称为独占锁或排它锁。
 
2>.施加的锁的粒度(简称锁粒度)有以下两种:
  表锁(table lock):锁定了整张表。 表锁是关系型数据库中最基本的锁策略,也是开销最小的锁策略(因为请求锁,施加锁,释放锁,管理锁都是急需要占用资源的)。
  行锁(row lock):只锁定了表中需要的行,不一定是一行哟。
  表锁有个缺点,就是当用户对一张表进行修改操作时会锁定整张表,如果表中的数据有1万行,而当前用户只是需要修改其中的几行内容,这会导致其他用户想要查询前用户不需要修改的行是被拒绝,需要等待该用户操作完成结束方能进行查询操作。因此我们总结为:“ 粒度越小,开销越大,但并发性越好, 粒度越大,开销越小,但并非性越差。”在实际生产环境中,数据库的锁策略至关重要。
 
3>. 根据锁的实现位置分为以下两种:
 1 MySQL锁:可以手动使用,可以使用显示锁
 2       存储引擎锁:自动进行的(隐式锁),
 3 a>.显示锁:
 4           lock tables:施加锁
 5           LOCK TABLES:解锁
 6          tbl_name lock_type
 7          [, tbl_name lock_type] ...
 8            READ | WRITE      锁的类型
 9           unlock tables:解锁
10  b>.InnoDB存储引擎也支持另外一种显示锁(锁定挑选出的部分行,行级锁)
11          select .... lock in share mode
12          select .... for update      

 1 mysql> select database();
 2 +-------------+
 3 | database()  |
 4 +-------------+
 5 | yinzhengjie |
 6 +-------------+
 7 1 row in set (0.00 sec)
 8
 9 mysql>
10 mysql> show tables;
11 +-----------------------+
12 | Tables_in_yinzhengjie |
13 +-----------------------+
14 | Classes               |
15 | score                 |
16 | students              |
17 | tearchers             |
18 +-----------------------+
19 4 rows in set (0.00 sec)
20
21 mysql>
22 mysql>
23 mysql>
24 mysql> desc Classes;
25 +-------------+-------------+------+-----+---------+-------+
26 | Field       | Type        | Null | Key | Default | Extra |
27 +-------------+-------------+------+-----+---------+-------+
28 | ClassID     | tinyint(4)  | NO   |     | NULL    |       |
29 | Class       | varchar(50) | NO   |     | NULL    |       |
30 | ClassMember | tinyint(4)  | NO   |     | NULL    |       |
31 +-------------+-------------+------+-----+---------+-------+
32 3 rows in set (0.00 sec)
33
34 mysql>
35 mysql> lock tables Classes read;            #将Classes 设置读锁
36 Query OK, 0 rows affected (0.00 sec)
37
38 mysql> select * from Classes;                #发现即使配置给Classes表配置了读锁,当是我们可以进行读取操作。
39 +---------+--------------------------+-------------+
40 | ClassID | Class                    | ClassMember |
41 +---------+--------------------------+-------------+
42 |       7 | 木叶忍者村第七班 |           4 |
43 |      10 | 木叶忍者村第十班 |           3 |
44 |       8 | 木叶忍者村第八班 |           3 |
45 |       3 | 木叶忍者村第三班 |           3 |
46 +---------+--------------------------+-------------+
47 4 rows in set (0.01 sec)
48
49 mysql>
50 mysql> insert into Classes value (1,'木叶忍者村第一班',5);        #事假读锁之后发现无法向Classes表中插入数据
51 ERROR 1099 (HY000): Table 'Classes' was locked with a READ lock and can't be updated
52 mysql>
53 mysql> unlock tables;        #现在我们进行一下解锁
54 Query OK, 0 rows affected (0.00 sec)
55
56 mysql> insert into Classes value (1,'木叶忍者村第一班',5);            #解锁成功后,我们就可以可以插入数据啦。
57 Query OK, 1 row affected (0.03 sec)
58
59 mysql> 

读锁案例展示

 1 mysql> select database();
 2 +-------------+
 3 | database()  |
 4 +-------------+
 5 | yinzhengjie |
 6 +-------------+
 7 1 row in set (0.00 sec)
 8
 9 mysql> .
10 mysql> lock tables Classes write;        #对Classes 添加写锁
11 Query OK, 0 rows affected (0.00 sec)
12
13 mysql>
14 mysql> select * from Classes;            #我们打开另外的一个中断,进程查询操作,发现一只没有数据返回,被阻塞了,需要等待Classes 这个表解除写锁(unlock tables;)才会返回数据哟

写锁案例展示

 1 mysql> show table status like 'Classes'\G
 2 *************************** 1. row ***************************
 3            Name: Classes
 4          Engine: InnoDB            #注意,设置行所的话该表的存储引擎必须是InnoDB哟!如果你的存储引擎是MyISAM的话,生产环境中不建议你用alter命令修改存储属性,因为生产环境中的表特别大,修改的时间可能会等待很差时间的!
 5         Version: 10
 6      Row_format: Compact
 7            Rows: 5
 8  Avg_row_length: 3276
 9     Data_length: 16384
10 Max_data_length: 0
11    Index_length: 0
12       Data_free: 4194304
13  Auto_increment: NULL
14     Create_time: 2017-11-20 02:30:11
15     Update_time: NULL
16      Check_time: NULL
17       Collation: utf8_general_ci
18        Checksum: NULL
19  Create_options:
20         Comment:
21 1 row in set (0.01 sec)
22
23 mysql> select * from Classes where ClassMember = 3 lock in share mode;        #设置读锁
24 +---------+--------------------------+-------------+
25 | ClassID | Class                    | ClassMember |
26 +---------+--------------------------+-------------+
27 |      10 | 木叶忍者村第十班 |           3 |
28 |       8 | 木叶忍者村第八班 |           3 |
29 |       3 | 木叶忍者村第三班 |           3 |
30 +---------+--------------------------+-------------+
31 3 rows in set (0.00 sec)
32
33 mysql> select * from Classes where ClassMember = 3 for update;                #设置写锁
34 +---------+--------------------------+-------------+
35 | ClassID | Class                    | ClassMember |
36 +---------+--------------------------+-------------+
37 |      10 | 木叶忍者村第十班 |           3 |
38 |       8 | 木叶忍者村第八班 |           3 |
39 |       3 | 木叶忍者村第三班 |           3 |
40 +---------+--------------------------+-------------+
41 3 rows in set (0.01 sec)
42
43 mysql>
44 mysql> select * from Classes ;                #我们发现可以查询到Classes ,那是因为Classes 这张表数据两太小,而设计行所则是当select语句执行完毕的时候默认就会释放掉行锁哟,因此对于比较大的文件你会看到效果。
45 +---------+--------------------------+-------------+
46 | ClassID | Class                    | ClassMember |
47 +---------+--------------------------+-------------+
48 |       7 | 木叶忍者村第七班 |           4 |
49 |      10 | 木叶忍者村第十班 |           3 |
50 |       8 | 木叶忍者村第八班 |           3 |
51 |       3 | 木叶忍者村第三班 |           3 |
52 |       1 | 木叶忍者村第一班 |           5 |
53 +---------+--------------------------+-------------+
54 5 rows in set (0.00 sec)
55
56 mysql> 

设置行所案例展示

三.MySQL事务(Transaction)
  事务就是一组原子性的查询语句,也就是说事物跟数据库创建或是表的创建是无关的哟,它是将多个查询当作一个独立的工作单元,典型的案例就是银行转账操作,当任何一条条件不满足是事物就会回退之前的操作。注意InnoDB是支持事物的而MyISAM是不支持事物的,所以不要妄图在MyISAM的存储引擎表上使用事物哟!
1>.ACID测试
1 事物是支持ACID测试的,也就是说能够满足ACID测试就表示其支持事务,或兼容事务。其中ACID满足以下四点:
2     A:Atomicity,原子性,都执行或者都不执行
3     C:Consistency,一致性,从一个一致性状态转到另外一个一致性状态
4     I:Isolaction,隔离性。一个事务的所有修改操作在提交前对其他事务时不可见的
5     D: Durability, 持久性,一旦事务得到提交,其所做的修改会永久有效

2>.隔离级别
 1 a>. READ UNCOMMITTED(读未提交)
 2   可以读取到别人没有提交的事物,又名“脏读”,因此这种方式数据安全性最差,但好处就是并发性最强。不能重复读(两次读取同一张表的内容可能不一致,也就是说,当不同的用户读取同一张表时,当某DBA对这张进行的删除表中的数据时,其他用户也能读取到删除的行即使别人还没有提交事物呢,而DBA回滚操作是,其他用户任然也可以看到回滚的内容,因此两次读取的内容是不一致的。),甚至会产生幻读(我们读取到的数据和真实数据不一致),因此这种模式用的相对较少。
 3 b>.READ COMMITTED(读提交)
 4   读提交指的是一个事物开始的时候只能看见已经提交事物的修改,其他未修改的事物这里通通都看不到,我们也可以说提交之后才能读,市面上常见的大多数关系型数据库隔离级别都是读提交,不过MySQL并不是。该模式存在幻读现象。对事物要求不特别严格的场景下,可以使用读提交。
 5 c>.REPEATABLE READ (可重读)
 6   可重读解决了脏读的问题,在最近的一个事物提交之前, 所有读到的事物都是一样的。因此,在同一事物中多次读同一数据的内容是一样的。但是仍然没有解决幻读的问题。mysql默认就是用的这种模式。该模式存在幻读现象。
 7 d>.SERIALIZABLE(可串行化)
 8   事物和事物之间严格进行隔离,只要涉及到同一个数据彼此之间是不能做任何交叠的,必须要等到其他人提交了或是把数据修改完成之后我们才能读取,通过强制事务的串行执行避免了幻读,但是性能极低。它的隔离界别极高,只有确保数据非常明确的情况下才能用到SERIALIZABLE。
 9 e>,跟事物相关的常用命令
10    start transaction        #启动事务
11    commit                #事务提交
12    rollback                #事务回顾
13    savepoint             #控制回滚的位置
14        SAVEPOINT identifier
15         ROLLBACK [WORK] TO [SAVEPOINT] identifier
16 f>.自动提交事物
17     如果没有显式启动事务,每个语句都会当作一个默认的事务,其执行完成会被自动提交。如果我们关闭了自动提交,那么我们就必须手动启动事物,然后手动进行提交。如果没有提交就会导致数据丢失哟!
18 g>.MVCC:多版本并发控制
19     每个事务启动时,InnoDB会为每个启动的事务提供一个当下时刻的快照。为实现此功能,InnoDB会为每个表提供两隐藏的字段,一个用于保存行的创建时间,一个用于保存行的失效时间(里面存储的系统版本号[system version number])
20     MVCC只在两个隔离级别下有效,即:read committed(读提交)和repeatable read(可重读)

 1 mysql> show table status where Name='students'\G
 2 *************************** 1. row ***************************
 3            Name: students
 4          Engine: InnoDB
 5         Version: 10
 6      Row_format: Compact
 7            Rows: 12
 8  Avg_row_length: 1365
 9     Data_length: 16384
10 Max_data_length: 0
11    Index_length: 16384
12       Data_free: 4194304
13  Auto_increment: 13
14     Create_time: 2017-11-20 03:57:26
15     Update_time: NULL
16      Check_time: NULL
17       Collation: utf8_general_ci
18        Checksum: NULL
19  Create_options:
20         Comment:
21 1 row in set (0.00 sec)
22
23 mysql> select * from students;
24 +-----------+--------------+-----+--------+---------+-----------+
25 | StudentID | Name         | Age | Gender | ClassID | TeacherID |
26 +-----------+--------------+-----+--------+---------+-----------+
27 |         1 | 旋涡鸣人 |  25 | boy    |       7 |         2 |
28 |         2 | 佐助       |  23 | boy    |       7 |         1 |
29 |         3 | 春野樱    |  21 | girl   |       7 |         3 |
30 |         4 | 奈良鹿丸 |  26 | boy    |      10 |         4 |
31 |         5 | 日向雏田 |  23 | girl   |       8 |         5 |
32 |         6 | 犬冢牙    |  24 | boy    |       8 |         5 |
33 |         7 | 油女志乃 |  23 | boy    |       8 |         5 |
34 |         8 | 秋道丁次 |  23 | boy    |      10 |         4 |
35 |         9 | 山中井野 |  22 | boy    |      10 |         4 |
36 |        10 | 日向宁次 |  26 | boy    |       3 |         6 |
37 |        11 | 李洛克    |  25 | boy    |       3 |         6 |
38 |        12 | 天天       |  26 | boy    |       3 |         6 |
39 +-----------+--------------+-----+--------+---------+-----------+
40 12 rows in set (0.00 sec)
41
42 mysql> start transaction;
43 Query OK, 0 rows affected (0.00 sec)
44
45 mysql> delete from students where StudentID=9;
46 Query OK, 1 row affected (0.00 sec)
47
48 mysql> select * from students;
49 +-----------+--------------+-----+--------+---------+-----------+
50 | StudentID | Name         | Age | Gender | ClassID | TeacherID |
51 +-----------+--------------+-----+--------+---------+-----------+
52 |         1 | 旋涡鸣人 |  25 | boy    |       7 |         2 |
53 |         2 | 佐助       |  23 | boy    |       7 |         1 |
54 |         3 | 春野樱    |  21 | girl   |       7 |         3 |
55 |         4 | 奈良鹿丸 |  26 | boy    |      10 |         4 |
56 |         5 | 日向雏田 |  23 | girl   |       8 |         5 |
57 |         6 | 犬冢牙    |  24 | boy    |       8 |         5 |
58 |         7 | 油女志乃 |  23 | boy    |       8 |         5 |
59 |         8 | 秋道丁次 |  23 | boy    |      10 |         4 |
60 |        10 | 日向宁次 |  26 | boy    |       3 |         6 |
61 |        11 | 李洛克    |  25 | boy    |       3 |         6 |
62 |        12 | 天天       |  26 | boy    |       3 |         6 |
63 +-----------+--------------+-----+--------+---------+-----------+
64 11 rows in set (0.00 sec)
65
66 mysql> rollback;        #在没有提交事物之前,是可以回滚你的所有操作哟。
67 Query OK, 0 rows affected (0.00 sec)
68
69 mysql> select * from students;
70 +-----------+--------------+-----+--------+---------+-----------+
71 | StudentID | Name         | Age | Gender | ClassID | TeacherID |
72 +-----------+--------------+-----+--------+---------+-----------+
73 |         1 | 旋涡鸣人 |  25 | boy    |       7 |         2 |
74 |         2 | 佐助       |  23 | boy    |       7 |         1 |
75 |         3 | 春野樱    |  21 | girl   |       7 |         3 |
76 |         4 | 奈良鹿丸 |  26 | boy    |      10 |         4 |
77 |         5 | 日向雏田 |  23 | girl   |       8 |         5 |
78 |         6 | 犬冢牙    |  24 | boy    |       8 |         5 |
79 |         7 | 油女志乃 |  23 | boy    |       8 |         5 |
80 |         8 | 秋道丁次 |  23 | boy    |      10 |         4 |
81 |         9 | 山中井野 |  22 | boy    |      10 |         4 |
82 |        10 | 日向宁次 |  26 | boy    |       3 |         6 |
83 |        11 | 李洛克    |  25 | boy    |       3 |         6 |
84 |        12 | 天天       |  26 | boy    |       3 |         6 |
85 +-----------+--------------+-----+--------+---------+-----------+
86 12 rows in set (0.00 sec)
87
88 mysql> 

事物回滚案例展示

 1 mysql> select * from students;
 2 +-----------+--------------+-----+--------+---------+-----------+
 3 | StudentID | Name         | Age | Gender | ClassID | TeacherID |
 4 +-----------+--------------+-----+--------+---------+-----------+
 5 |         1 | 旋涡鸣人 |  25 | boy    |       7 |         2 |
 6 |         2 | 佐助       |  23 | boy    |       7 |         1 |
 7 |         3 | 春野樱    |  21 | girl   |       7 |         3 |
 8 |         4 | 奈良鹿丸 |  26 | boy    |      10 |         4 |
 9 |         5 | 日向雏田 |  23 | girl   |       8 |         5 |
10 |         6 | 犬冢牙    |  24 | boy    |       8 |         5 |
11 |         7 | 油女志乃 |  23 | boy    |       8 |         5 |
12 |         8 | 秋道丁次 |  23 | boy    |      10 |         4 |
13 |         9 | 山中井野 |  22 | boy    |      10 |         4 |
14 |        10 | 日向宁次 |  26 | boy    |       3 |         6 |
15 |        11 | 李洛克    |  25 | boy    |       3 |         6 |
16 |        12 | 天天       |  26 | boy    |       3 |         6 |
17 +-----------+--------------+-----+--------+---------+-----------+
18 12 rows in set (0.00 sec)
19
20 mysql> start transaction;
21 Query OK, 0 rows affected (0.00 sec)
22
23 mysql> delete from students where StudentID=9;
24 Query OK, 1 row affected (0.00 sec)
25
26 mysql> commit;            #注意,这里是提交了之后,这个事物就结束了。回滚也无法回滚啦!
27 Query OK, 0 rows affected (0.16 sec)
28
29 mysql> select * from students;
30 +-----------+--------------+-----+--------+---------+-----------+
31 | StudentID | Name         | Age | Gender | ClassID | TeacherID |
32 +-----------+--------------+-----+--------+---------+-----------+
33 |         1 | 旋涡鸣人 |  25 | boy    |       7 |         2 |
34 |         2 | 佐助       |  23 | boy    |       7 |         1 |
35 |         3 | 春野樱    |  21 | girl   |       7 |         3 |
36 |         4 | 奈良鹿丸 |  26 | boy    |      10 |         4 |
37 |         5 | 日向雏田 |  23 | girl   |       8 |         5 |
38 |         6 | 犬冢牙    |  24 | boy    |       8 |         5 |
39 |         7 | 油女志乃 |  23 | boy    |       8 |         5 |
40 |         8 | 秋道丁次 |  23 | boy    |      10 |         4 |
41 |        10 | 日向宁次 |  26 | boy    |       3 |         6 |
42 |        11 | 李洛克    |  25 | boy    |       3 |         6 |
43 |        12 | 天天       |  26 | boy    |       3 |         6 |
44 +-----------+--------------+-----+--------+---------+-----------+
45 11 rows in set (0.00 sec)
46
47 mysql>
48 mysql> rollback;        #你会很明显的发现提交事物之后回滚也不生效啦,因为你没有启动新的事物啊。
49 Query OK, 0 rows affected (0.00 sec)
50
51 mysql> select * from students;
52 +-----------+--------------+-----+--------+---------+-----------+
53 | StudentID | Name         | Age | Gender | ClassID | TeacherID |
54 +-----------+--------------+-----+--------+---------+-----------+
55 |         1 | 旋涡鸣人 |  25 | boy    |       7 |         2 |
56 |         2 | 佐助       |  23 | boy    |       7 |         1 |
57 |         3 | 春野樱    |  21 | girl   |       7 |         3 |
58 |         4 | 奈良鹿丸 |  26 | boy    |      10 |         4 |
59 |         5 | 日向雏田 |  23 | girl   |       8 |         5 |
60 |         6 | 犬冢牙    |  24 | boy    |       8 |         5 |
61 |         7 | 油女志乃 |  23 | boy    |       8 |         5 |
62 |         8 | 秋道丁次 |  23 | boy    |      10 |         4 |
63 |        10 | 日向宁次 |  26 | boy    |       3 |         6 |
64 |        11 | 李洛克    |  25 | boy    |       3 |         6 |
65 |        12 | 天天       |  26 | boy    |       3 |         6 |
66 +-----------+--------------+-----+--------+---------+-----------+
67 11 rows in set (0.00 sec)
68
69 mysql>

提交事物案例展示

 1 mysql> select * from students;
 2 +-----------+--------------+-----+--------+---------+-----------+
 3 | StudentID | Name         | Age | Gender | ClassID | TeacherID |
 4 +-----------+--------------+-----+--------+---------+-----------+
 5 |         1 | 旋涡鸣人 |  25 | boy    |       7 |         2 |
 6 |         2 | 佐助       |  23 | boy    |       7 |         1 |
 7 |         3 | 春野樱    |  21 | girl   |       7 |         3 |
 8 |         4 | 奈良鹿丸 |  26 | boy    |      10 |         4 |
 9 |         5 | 日向雏田 |  23 | girl   |       8 |         5 |
10 |         6 | 犬冢牙    |  24 | boy    |       8 |         5 |
11 |         7 | 油女志乃 |  23 | boy    |       8 |         5 |
12 |         8 | 秋道丁次 |  23 | boy    |      10 |         4 |
13 |        10 | 日向宁次 |  26 | boy    |       3 |         6 |
14 |        11 | 李洛克    |  25 | boy    |       3 |         6 |
15 |        12 | 天天       |  26 | boy    |       3 |         6 |
16 +-----------+--------------+-----+--------+---------+-----------+
17 11 rows in set (0.00 sec)
18
19 mysql> start transaction;        #启动一个事物
20 Query OK, 0 rows affected (0.00 sec)
21
22 mysql> delete from students where StudentID=2;
23 Query OK, 1 row affected (0.00 sec)
24
25 mysql> savepoint a;        #当我们删除了一行数据之后,我们对其操作进行一个记录。
26 Query OK, 0 rows affected (0.00 sec)
27
28 mysql> delete from students where StudentID=3;
29 Query OK, 1 row affected (0.00 sec)
30
31 mysql>
32 mysql> savepoint b;
33 Query OK, 0 rows affected (0.00 sec)
34
35 mysql> delete from students where StudentID=4;
36 Query OK, 1 row affected (0.00 sec)
37
38 mysql> select * from students;
39 +-----------+--------------+-----+--------+---------+-----------+
40 | StudentID | Name         | Age | Gender | ClassID | TeacherID |
41 +-----------+--------------+-----+--------+---------+-----------+
42 |         1 | 旋涡鸣人 |  25 | boy    |       7 |         2 |
43 |         5 | 日向雏田 |  23 | girl   |       8 |         5 |
44 |         6 | 犬冢牙    |  24 | boy    |       8 |         5 |
45 |         7 | 油女志乃 |  23 | boy    |       8 |         5 |
46 |         8 | 秋道丁次 |  23 | boy    |      10 |         4 |
47 |        10 | 日向宁次 |  26 | boy    |       3 |         6 |
48 |        11 | 李洛克    |  25 | boy    |       3 |         6 |
49 |        12 | 天天       |  26 | boy    |       3 |         6 |
50 +-----------+--------------+-----+--------+---------+-----------+
51 8 rows in set (0.00 sec)
52
53 mysql> rollback to b;    #表示回滚到b的节点中去,也就是说b以后的操作都会恢复回来。
54 Query OK, 0 rows affected (0.00 sec)
55
56 mysql> select * from students;
57 +-----------+--------------+-----+--------+---------+-----------+
58 | StudentID | Name         | Age | Gender | ClassID | TeacherID |
59 +-----------+--------------+-----+--------+---------+-----------+
60 |         1 | 旋涡鸣人 |  25 | boy    |       7 |         2 |
61 |         4 | 奈良鹿丸 |  26 | boy    |      10 |         4 |
62 |         5 | 日向雏田 |  23 | girl   |       8 |         5 |
63 |         6 | 犬冢牙    |  24 | boy    |       8 |         5 |
64 |         7 | 油女志乃 |  23 | boy    |       8 |         5 |
65 |         8 | 秋道丁次 |  23 | boy    |      10 |         4 |
66 |        10 | 日向宁次 |  26 | boy    |       3 |         6 |
67 |        11 | 李洛克    |  25 | boy    |       3 |         6 |
68 |        12 | 天天       |  26 | boy    |       3 |         6 |
69 +-----------+--------------+-----+--------+---------+-----------+
70 9 rows in set (0.00 sec)
71
72 mysql> 

指定回滚位置案例展示

 1 mysql> show global variables like 'autocommit';        #我们可以进行查看,发现它是开启的状态。
 2 +---------------+-------+
 3 | Variable_name | Value |
 4 +---------------+-------+
 5 | autocommit    | ON    |
 6 +---------------+-------+
 7 1 row in set (0.00 sec)
 8
 9 mysql> select @@session.autocommit;
10 +----------------------+
11 | @@session.autocommit |
12 +----------------------+
13 |                    1 |
14 +----------------------+
15 1 row in set (0.00 sec)
16
17 mysql> set session autocommit = 0;        #我们关闭自动提交的功能。
18 Query OK, 0 rows affected (0.00 sec)
19
20 mysql> select @@session.autocommit;
21 +----------------------+
22 | @@session.autocommit |
23 +----------------------+
24 |                    0 |
25 +----------------------+
26 1 row in set (0.00 sec)
27
28 mysql> show global variables like 'autocommit';        #再次查看,发现它是被关闭了。
29 +---------------+-------+
30 | Variable_name | Value |
31 +---------------+-------+
32 | autocommit    | OFF   |
33 +---------------+-------+
34 1 row in set (0.00 sec)
35
36 mysql> 

关闭自动提交事物案例展示

 1 mysql> show global  variables like 'tx_isolation';
 2 +---------------+-----------------+
 3 | Variable_name | Value           |
 4 +---------------+-----------------+
 5 | tx_isolation  | REPEATABLE-READ |
 6 +---------------+-----------------+
 7 1 row in set (0.00 sec)
 8
 9 mysql> select @@global.tx_isolation;
10 +-----------------------+
11 | @@global.tx_isolation |
12 +-----------------------+
13 | REPEATABLE-READ       |
14 +-----------------------+
15 1 row in set (0.00 sec)
16
17 mysql> 

查看MySQL的事物隔离级别

转载于:https://www.cnblogs.com/yinzhengjie/p/7868782.html

MySQL事务及隔离级别详解相关推荐

  1. 数据库事务的四大特性以及事务的隔离级别详解

    作者 : fjdingsd 来源 : 博客园 本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ ...

  2. 数据库并发机制和事务的隔离级别详解

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/64444896冷血之心的博客) 本文将从以下4个方面来展开: (1) ...

  3. SQL Server-聚焦事务、隔离级别详解(二十九)

    前言 事务一直以来是我最薄弱的环节,也是我打算重新学习SQL Server的出发点,关于SQL Server中事务将分为几节来进行阐述,Always to review the basics. 事务简 ...

  4. 同一个事务里面对同一条数据做2次修改_[玩转MySQL之九]MySQL事务ACID[2-1]ACID详解...

    一. 引言 做数据库相关工作的同学都知道事务,就是一个操作序列 ,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位, ACID又是事务的四大特性. 那么就会有如下疑问: ACID具体代表什 ...

  5. SQL Server事务隔离级别详解

    SQL Server事务隔离级别详解 标签: SQL SEERVER/MSSQL SERVER/SQL/事务隔离级别选项/设置数据库事务级别 SQL 事务隔离级别 概述 隔离级别用于决定如果控制并发用 ...

  6. MySQL 四种事务隔离级别详解及对比--转

    http://www.jb51.net/article/100183.htm 接的隔离级别.它的语法如下: ? 1 SET [SESSION | GLOBAL] TRANSACTION ISOLATI ...

  7. 5、MySQL事务隔离级别详解

    事务的隔离性就是指当多个事务同时运行时,各事务之间相互隔离,不可互相干扰.如果事务没有隔离性,就容易出现脏读.不可重复读和幻读等情况. 为了保证并发时操作数据的正确性,数据库都会有事务隔离级别的概念. ...

  8. MySQL 中事务、事务隔离级别详解

    一.事务的概念 1.事务的概念 2.在mysql中哪些存储引擎(表类型)支持事务哪些不支持 3.事务的四个属性 4.mysql事务的创建与存在周期 5.mysql行为 6.事务的隔离性和性能 7.my ...

  9. mysql事务隔离级别详解_高性能MySQL-详解事务与隔离级别

    本文主要包括一下内容: (1) 事务的概念与ACID (2)事务的隔离级别 (3)MySQL中的事务 1. 事务与ACID 理解事务是其它高级概念的基础.事务:事务就是一组原子性的SQL查询,或则说是 ...

最新文章

  1. 4道经典指针笔试题讲解 ~
  2. 进程和程序:编写shell——《Unix/Linux编程实践教程》读书笔记(第8章)
  3. 多线程下的HashMap竟然绕环了
  4. guava-collections
  5. QT MSVC 中文报错
  6. Validation(2)
  7. 轻松使用make menuconfig达到内核的升级!
  8. STM32H743+CubeMX-梳理MPU的设置
  9. checkbox 点击搜索失去焦点_早些年植入三焦点晶体矫正老花的人,现在怎么样了?...
  10. python 将字符串转换为字典
  11. 使 VC2013 编写的程序运行在其它电脑上
  12. 神经网络做多元线性回归,神经网络是线性模型吗
  13. 计算机重启很慢,电脑重启慢的原因
  14. 互联网日报 | 字节跳动发布独立教育品牌“大力教育”;哈啰出行试水网约车;京东“好房京选”线下品牌落地...
  15. 双系统笔记本 android,安卓不止平板有 教你使用笔记本装安卓,和WINDOWS一起双系统亦可以的哦!(图解)...
  16. 软件系统产品线特征及构建过程
  17. N-Tiers开发方式(为何使用COM+组件的撰写商业逻辑层)
  18. 失眠怎么办?试试汤臣倍健褪黑素和以下方法!
  19. 【仙女踩坑实录】Macbook修改文件创建时间
  20. c语言复合赋值表达式题目,C语言中复合赋值运算,表达式等知识.doc

热门文章

  1. 德媒:外景代替了现实 中国人拍婚纱照跑到很远地方
  2. VB:设定 MsgBox 在若干时间之后若无回应则自动关闭
  3. 股市常胜将军都懂得适时休息
  4. 百度Q1营收241亿,李彦宏挥刀改革:“尽力了”没用,要确保在必须赢的战场上胜利...
  5. 81个关键点,帮你紧密追踪女神的脸,比Dlib还多了13点 | 有代码
  6. 别人家只会编段子,谷歌带大家找乐子 | 愚人节の真 · 大型线下踏春游戏
  7. 静态代码块和单例混合
  8. 日本第四次产业革命瞄准物联网
  9. django 接收ajax请求
  10. adobe reader运行时出现“Invalid plugin detected”错误的解决办法