一、事务简介

事务是数据库区分文件系统的重要特征之一,数据库引入的主要目的:事务会把数据库从一种一致状态转换到另一种一致状态,在数据库提交工作时,可以确保修改的已经保存。
事务的四个特性ACID:

  • 原子性

整个过程要么做要么不做,不存在做一半的情况。

  • 一致性

事务将数据库从一种状态变为下一种一致的状态。

  • 隔离性

或者叫并发控制,锁等。要求每个读写事务的对象对其他事务的操作对象能够互相分离,其他事务不可见。数据库提供一种粒度锁,主要通过锁解决该问题。

  • 持久性

事务一旦提交,其结果是永久的,能够恢复。主要通过redo和undo 重做日志来解决。
除了隔离性通过锁,其他的都可以通过redo和undo来解决。
事务分类

  • 扁平事务

    所有操作处于同一层次,使用最多

  • 带保存点的扁平事务

    1. 记录保存点的状态,能够回到保存点,**能够回滚到任意保存点。**
  • 链事务

    提交一个事务释放不需要的数据对象,马上开启下个事务,两个事务合并为一个原子操作,只能够回滚到最近的一个保存点。

  • 嵌套事务

    顶层事务控制多个事务,每个事务有子事务,每个子事务单独,可以是扁平事务等等。回滚只是让子事务回滚(不具备D的特性),InnoDB 并不支持,但是可以通过带保存点的事务模拟串行的嵌套事务

  • 分布式事务

一个事务中,操作的对象是不同的数据库,所以整个事务要么都完成,要么都失败。

二、重做日志

2.1 redo

  1. 实现事务的持久性,主要分为两个部分,一个是日志缓冲,二是重做日志文件<br /> 事务每次提交都要先将该事务所有日志写入重做日志文件,通过**fsync**,完成。每次事务提交后InnoDB默认自习fsync,可以关闭该操作提高数据库性能。<br /> 二进制日志(**binlog**),其用来进行主从复制和Point-IN-Time(PIT)的恢复。<br />**区别**:重做日志是在InnoDB引擎层完成,二binlog是在mysql层完成。<br /> 重做日志块(512字节),和磁盘扇区一样保证了日志写入的原子性。(注意每个块都有信息,所以真正存储的并没有512字节)。<br />**log group: **重做日志组,ha_innobase.cc禁止了该功能,因此innodb实际只有一个组,innodb1.2 版本以前重做日志总大小小于**4GB**,1.2后提高到**512GB**。<br />重做日志格式:pass<br />日志序列号:pass<br />恢复:每次启动都会进行日志恢复,重做日志记录的是物理日志,能够快速恢复。

2.2 undo

redo的是事务的行为,能够通过其对重做操作,但是不能够回滚。对数据修改时不但会产生redo,还会产生一定量的undo.
undo是逻辑日志,只是把数据库逻辑恢复到原来的样子,并不是物理恢复,例如:insert —》 delete , update ->update 回去
purge: delete update 有时候并不是直接删除原有的数据,加入表上存在索引,B+树上并没有马上删除,操作被延时了。purge 最终完成这些操作。
group commit : 一次fsync能够刷新多个事务的日志,

三、事务控制语句

  1. 开发中很少使用,后续补上!!。。。

四、隐式提交的SQL、事务统计、隔离级别

DDL语句( ALTER DATABASE 、UPDATE DATA ….)、修改mysql架构的操作(CREATE USER 、 GRANT 、REVOKE等)、管理语句(ANAKYZE TABLE、CACHE INDEX等等)
另外InnoDB 默认是自动提交事务,
QPS(每秒请求数量)、TPS(每秒处理事务的能力)
隔离级别

  • Read Uncommited:又叫浏览访问 允许事务读取其他未提交事务的变更,脏读,不可重复读,幻读都会出现。
  • Read Commited:游标稳定,只允许事务读取其他事务提交的更改,可以避免脏读,但有不可重复读,幻读
  • Pepeatable Read:在此事务持续期间不允许其他事务更改该字段,但可读,可出现幻读,innodb通过使用Next-key-lock 避免幻读,所以能够达到Serialization 级别。
  • Serialization:在此事务期间禁止其他事务的任何操作,使用该级别,select会默认加上 lock in share mode

五、分布式事务

  1. .... 没用过....

六、坏习惯

6.1 不要再循环中使用commite,而是一次commite

6.2 自动提交

不会其他的….

6.3 自动回滚

不会其他的…..

6.4 长事务

  1. 应该拆分为多个事务,分开处理,即使回滚,也能够保存某一特定的数据。