系列文章说明

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


事务


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

比如转账的流程就是一个事务:

mysql匿名块使用 mysql匿名事务_ci

    当发送者输入支付密码后,这个事务就开始了:

    ①更新发送者余额信息 -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;DML1DML2 失败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: 0mysql> 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: 0mysql> 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: 0mysql> 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



mysql匿名块使用 mysql匿名事务_mysql隐式事务_02