MYSQL学习笔记之事务
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MYSQL学习笔记之事务相关的知识,希望对你有一定的参考价值。
(一)什么是事务??
事务其实就是一个完整的业务逻辑,不可再分,是一个最小的工作单元。
准确来说,一个事务就是批量的DML语句同时成功或者同时失败。
说明:只有DML语句与事务有关系,其他语句与事务无关
DML语句: insert、delete、update语句(对数据库表中的数据进行操作)
(二)存在原因
在处理某中业务的时候,需要多条DML语句共同联合起来才能完成。
(三)如何保持?
InnoDB存储引擎:提供一组用来记录事务性活动的日志文件。
在事务执行的过程中,每一条DML的操作都会记录到“事务性活动的日志文件”中。
在事务执行的过程中,即可以提交事务,也可以回滚事务。
提交事务??(commit; 语句 )
清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中
提交事务标志着事物的结束,并且是一种全部成功的结束。
回滚事务??(rollback;语句---->上一次提交<commit>的位置 )
将之前的DML操作全部撤销,并且清空事务性活动的日志文件,回滚事务标志着
事务的结束,并且是一种全部失败的结束。
mysql默认情况下是支持自动提交的(执行一次sql语句,就执行一次)
缺点:一个完整的业务是需要经过多条DML语句共同执行才可能完成,为了保证数据的安全,必须要求同时成功之后再提交,
所以要关闭这种默认自动提交机制。
如何关闭呢??
命令:start transaction;
#------------------------------回滚事务-----------------------------------
mysql> select * from flower;
Empty set (0.00 sec)
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into flower(name)values(玫瑰);
Query OK, 1 row affected (0.00 sec)
mysql> insert into flower(name)values(月季);
Query OK, 1 row affected (0.00 sec)
mysql> select * from flower;
+------+
| name |
+------+
| 玫瑰 |
| 月季 |
+------+
2 rows in set (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from flower;
Empty set (0.00 sec)
#-----------------------提交事务----------------------------
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into flower(name)values(玫瑰);
Query OK, 1 row affected (0.00 sec)
mysql> insert into flower(name)values(月季);
Query OK, 1 row affected (0.00 sec)
mysql> insert into flower(name)values(牡丹);
Query OK, 1 row affected (0.00 sec)
mysql> select * from flower;
+------+
| name |
+------+
| 玫瑰 |
| 月季 |
| 牡丹 |
+------+
3 rows in set (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from flower;
+------+
| name |
+------+
| 玫瑰 |
| 月季 |
| 牡丹 |
+------+
3 rows in set (0.00 sec)
(四)事务特性
I.原子性: 指的是事务的最小工作单元,不可再分。
II.一致性:所有事务要求,在同一个事务中,所有的操作必须同时成功,或者同时失败,以保证数据的一致性。
III.隔离性:是针对数据资源的并发访问,规定了各个事务之间相互影响的程度。
IV.持久性: 事务最终结束的一个屏障。事务提交,就相当于没有保存到硬盘上的数据保存到硬盘上。
补充:
事物之间的隔离性
A、B教室中间有一道墙,根据墙的厚薄,可以分为不同的级别
事务与事务之间也存在一定的级别,具体分类如下:
(1)读未提交: read uncommitted(最低的隔离级别)
基本介绍:事务A可以读取到事务B未提交的数据。
存在问题:脏读现象(dirty read)
(2)读已提交: read committed<oracle默认的隔离级别>
基本介绍:事务A只能读取到事务B提交之后的数据。
存在问题:不可重复读取数据(由于事务B并未完全提交导致事务A读取的时候只能读取到提交的数据)
特点:读到的数据比较真实
(3)可重复读:repeatable read<读取不到提交之后的数据,永远读取的都是开启事务时的数据>
基本介绍:事务A开启之后,每一次在事务A中读取到的数据都是一致的(即使事务B的数据已经修改,事务A读取到的数据还是不会改变)
存在问题: 幻影读(每次读取的数据都是幻影,不够绝对的真实)
(4) 序列化/串行化: serializable(最高的隔离级别)
隔离级别最高,效率最低,解决了所有的问题,表示事务排队,不能并发。
(五)实践验证
查看默认隔离级别:
mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ |
+-------------------------+
1 row in set (0.00 sec)
验证: read uncommitted
mysql>set gloabl transaction isolation level read uncommitted;
事务A 事务B
---------------------------------------------------------------------------- use bjpowernode; use bjpowernode;
start transaction;
select * from t_user;
start transaction;
insert into t_user values(zhangsan)
select * from t_user;
结果:事务B插入后,可以在事务A中查到,在事务B<rollback>后就在事务A中查不到了
--------------------------------------------------------------------------------------
验证:read committed
mysql>set gloabl transaction isolation level read committed;
事务A 事务B
----------------------------------------------------------------------------
use bjpowernode;
use bjpowernode;
start transaction;
start transaction;
select * from t_user;
insert into t_user values(zhangsan);
select * from t_user;
commit;
select * from t_user;
-------------------------------------------------------------------------------------
验证:repetable read
mysql>set gloabl transaction isolation level repeatable read;
事务A 事务B
----------------------------------------------------------------------------
use bjpowernode;
use bjpowernode;
start transaction;
start transaction;
select * from t_user;
insert into t_user values(zhangsan);
insert into t_user values(lisi);
select * from t_user;
结果:事务A查到的结果一直没变,与丝毫不受事务B的任何影响。
----------------------------------------------------------------------------
验证:serializable
mysql>set gloabl transaction isolation level serializable;
事务A 事务B
---------------------------------------------------------------------------
use bjpowernode;
use bjpowernode;
start transaction;
start transaction;
select * from t_user;
insert into t_user values(fei);
select * from t_useer;(一致等待,除非事务A提交)
结果:事务A和事务B不能同时操作同一个表,会有一个先后顺序。
优秀博文:
https://baijiahao.baidu.com/s?id=1709428402761709469&wfr=spider&for=pc
以上是关于MYSQL学习笔记之事务的主要内容,如果未能解决你的问题,请参考以下文章