MySQL系列-InnoDB核心特性之事务介绍
运维少年 运维少年
系列文章说明
MySQL系列文章包含了软件安装、具体使用、备份恢复等内容,主要用于记录个人的学习笔记,主要使用的MySQL版本为5.7.28,服务器系统版本为CentOS 7.5。本章节内容为InnoDB核心特性之事务介绍。
事务
什么是事务呢?事务是伴随着”交易类“的业务场景出现的工作机制。保证交易的完整性。
比如转账的流程就是一个事务:
当发送者输入支付密码后,这个事务就开始了:
①更新发送者余额信息 -0.01¥
②更新接收者余额信息 +0.01¥
事务结束。
事务的四大特性 ACID
A -- Atomicity(原子性):原子是物质的最小构成到能源,具备不可再分的特性。即在一个事务工作单元中,所有的标准事务语句(DML),要么全部执行成功,要么全部回滚,同一个事务中不会出现某些事务语句成功,某些事务语句失败的情况(不能扣了发送者的余额,而不增加接收者的余额)。
C -- Consistency(一致性):MySQL的各项功能设计,都是最终要保证一致性,事务发生前、中、后都应该保证次数据始终一致状态。(比如A发送了100元,B不能只收到50或者200)
I -- Isolation(隔离性):MySQL可以是支持多事务并发工作的数据库,某个事务工作的时候,不能收到其他事务的影响。
D -- Durability(持久性):当事务提交后(commit),此次事务操作的所有数据“落盘”,都要永久保存下去。不会因为数据实例发生故障导致数据失效。
事务 标准的事务语句
事务的标准语句包括:insert、delete、update、select
事务 事务生命周期管理
事务的执行过程:
① begin;
②DML1;
③DMLn...
④commit;
自动提交事务:
所有的DML语句都属于某个事务,那为什么我们在之前的操作中,并不用输入begin和commit呢?因为MySQL默认有自动提交机制,可用以下语句进行查看:
select @@autocommit;
结果为1,则开启了自动提交功能,结果为0则没有开启。
自动提交如果开启,则执行DML语句时,MySQL会自动在DML语句前添加begin,在语句后添加commit;
如果需要修改可以使用以下办法进行修改:
临时生效:
set global autocommit=0; 重新开启会话生效
永久生效:
my.cnf
autocommit=0 重启数据库生效
隐式提交:
①设置了autocommit=1
②执行了DDL,DCL等非DML语句,会自动提交上面的事务
③再次执行begin后,之前的事务会自动提交
回滚:
在一个事务没有提交之前,可以使用rollback进行回滚(即不保存更改,数据恢复到事务开始前。),事务回滚后,也代表着该事务结束。
隐式回滚:
①事务没有提交前,会话被断开、数据库宕机,会隐式回滚
②事务语句执行失败
degin;
DML1
DML2 失败
commit; 自动回滚
例子:
①手动开启一个事务,操作后进行commit;
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> update city set name='yunweishaonian' where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> select name from city where id=1;
+----------------+
| name |
+----------------+
| yunweishaonian |
+----------------+
1 row in set (0.00 sec)
mysql>
②手动开启一个事务,修改数据后回滚
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> update city set name='yunweishaonian2020' where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select name from city where id=1;
+--------------------+
| name |
+--------------------+
| yunweishaonian2020 |
+--------------------+
1 row in set (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select name from city where id=1;
+----------------+
| name |
+----------------+
| yunweishaonian |
+----------------+
1 row in set (0.00 sec)
mysql>
③在事务中修改数据后,使用非DML语句,测试是否还能够回滚
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> update city set name='yunweishaonian2020' where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select name from city where id=1;
+--------------------+
| name |
+--------------------+
| yunweishaonian2020 |
+--------------------+
1 row in set (0.00 sec)
mysql> create database yunwei2020;
Query OK, 1 row affected (0.02 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select name from city where id=1;
+--------------------+
| name |
+--------------------+
| yunweishaonian2020 |
+--------------------+
1 row in set (0.00 sec)
mysql>
可见,如果执行了非DML语句,事务会自动commit,提交成功的数据是无法使用rollback进行回滚的。
end