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;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

©著作权归作者所有:来自51CTO博客作者mb5ffd6f0f39006的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. MySQL系列-DML语句之select多表连接查询
  2. MySQL系列-DML语句
  3. SQL基础知识V2——SELECT
  4. MySQL系列-DML语句之select单表查询
  5. MySQL系列-DDL语句
  6. SQL高级知识V2——动态SQL
  7. 你有一份经典SQL语句大全,请注意查收!!!
  8. Hive3.1.0入门:从一条建表语句掌握三种复合数据类型使用
  9. 如何用Excel快速生成SQL语句,用过的人都说好

随机推荐

  1. 高通平台Android N SystemUI添加qcnvitem
  2. Android强制设置横屏或竖屏
  3. Android 控件抖动效果
  4. Android Studio第二十七期 - RecycleView
  5. Android ViewFlipper简单示例
  6. Android 权限添加
  7. Android 项目生成证书指纹(MD5、SHA1、SHA
  8. Android中的动画
  9. Binder之bindService
  10. android 增加重启功能