MySQL系列-InnoDB核心特性之事务介绍

MySQL系列-InnoDB核心特性之事务介绍

运维少年 运维少年

系列文章说明

MySQL系列文章包含了软件安装、具体使用、备份恢复等内容,主要用于记录个人的学习笔记,主要使用的MySQL版本为5.7.28,服务器系统版本为CentOS 7.5。本章节内容为InnoDB核心特性之事务介绍。

事务

什么是事务呢?事务是伴随着”交易类“的业务场景出现的工作机制。保证交易的完整性。

比如转账的流程就是一个事务:
MySQL系列-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

猜你喜欢

转载自blog.51cto.com/15082392/2656000