事务的特性:

InnoDB中的数据库完全符合ACID特性:
A(原子性)
要么都做要么都不做(即事务中的每个操作都要成功,只要有一个失败,整个事务都要失败 rollback)
C(一致性)
指事务将数据库从一种状态转换为下一种一致性的状态。在事务开始前和事务结束后,数据的完整性约束没有被破坏,事务是一执行的单位,如果事务中某个动作失败了,系统可以自动撤销事务——返回初始状态
I(隔离性)
事务的隔离性要求没个读写事务的对象对其他事务的操作对象能相互隔离,即提交前对其他事务都不可见。
D(持久性)
事务一旦提交,其结构就是永久性的。但是只能从数据库本身来保证结构的持久性。

事务的分类:

扁平事务:

  1. 是事务类型中最简单的一种,在扁平事务中所有的事务都处一同一层次,由begin开始,commit\rollback结束,其间的操作是原子性的,要么执行,要么回滚;<br />** 扁平事务的三种不同结果:**<br /> ![image.png](https://cdn.nlark.com/yuque/0/2021/png/12862216/1623718415171-11b55341-aaeb-4e32-9290-604371d388bb.png#clientId=u38c7fa4e-85af-4&from=paste&height=202&id=uccc23554&margin=%5Bobject%20Object%5D&name=image.png&originHeight=403&originWidth=945&originalType=binary&ratio=2&size=103544&status=done&style=none&taskId=u340676da-faab-4b01-9a71-7eb6a4ae490&width=472.5)<br /> 扁平事务的主要限制是不能提交或者回滚事务的某一部分,或分几个步骤提交

带有保存点的扁平事务:

除了支持扁平事务的操作外,允许我们在事务的执行过程中回滚到同一事务中较早的一个状态。保存点用来通知系统应当记住事务当前的态度保存点使用save work函数来建立<br />**示列;**
mysql> select * from t;
Empty set (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t select 1;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into t select 2;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> savepoint a;/*设置保存点 a(savepoint后面不能跟数字)*/
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t select 3;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> rollback to a; /*回滚到保存点a 所以select 3这条记录不会被插入*/
Query OK, 0 rows affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t;
+------+
| a    |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)

链事务:

链事务的思想是在提交一个事务的时候,释放不需要的数据对象,(通过commit work来提交上一个事务同时开启下一个事务)将必要的处理上下文隐式地传递给下一个要开始的事务。注意的是提交操作和开始操作是一个原子性操作,意味着下一个事务将看到上一个事务的结果
链式事务与带有保存点的扁平事务不同的是i带有保存点的扁平事务能回滚到任意正确的保存点。而链式事务的回滚仅限于当前事务,即只恢复到最近一个保存点。
注意:使用链事务前要先设置completion_type的值为1;

mysql> select @@completion_type;
+-------------------+
| @@completion_type |
+-------------------+
| NO_CHAIN          |
+-------------------+
1 row in set (0.00 sec)
mysql> set @@completion_type=1;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@completion_type;
+-------------------+
| @@completion_type |
+-------------------+
| CHAIN             |
+-------------------+
1 row in set (0.00 sec)
如果该值为0的话,那么commit work 和commit就没有任何区别,但是将改值设为1后,commit work 等同于 commit and chain表示马上开启下一个隔离级别相同的事务。当改制为2时commit work提交后会自动断开与sql 服务器的连接
mysql> set @@completion_type=2;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@completion_type;
+-------------------+
| @@completion_type |
+-------------------+
| RELEASE           |
+-------------------+
1 row in set (0.00 sec)
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t select 5;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> commit work;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t;/*此时必须要重新连接服务才能执行sql语句*/
ERROR 2013 (HY000): Lost connection to MySQL server during query
mysql>

示列

mysql> select @@completion_type;
+-------------------+
| @@completion_type |
+-------------------+
| CHAIN             |
+-------------------+
1 row in set (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t select 3;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into t select 4;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> commit work;/*自动开启下一相同隔离级别的事务*/
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t select 5;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into t select 6;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t;
+------+
| a    |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

mysql>

嵌套事务:

是一个层次机构框架,由一个顶级事务控制着各个层次的事务

分布式事务:

通常在个分布式环境下运行的扁平事务,因此需要根据数据所在的位置访问网络中的不同节点,对于分布式事务,其同样需要满足acid的特性,要么都成功,但只要有一个失败都失败
示列:单个结点上运行xa(分布式事务)

mysql> xa start 'a';/*开启a结点中*/
Query OK, 0 rows affected (0.00 sec)
mysql> insert into learn1.t select 12;
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> xa end 'a';/*a结点关闭*/
Query OK, 0 rows affected (0.00 sec)

mysql> xa prepare 'a';/*准备要提交的结点 (没有这一步无法提交)*/
Query OK, 0 rows affected (0.00 sec)

mysql> xa recover\G/*查看结点的信息*/
*************************** 1. row ***************************
    formatID: 1
gtrid_length: 1
bqual_length: 0
        data: a
1 row in set (0.00 sec)

mysql> xa commit 'a';/*提交a节点*/
Query OK, 0 rows affected (0.00 sec)

mysql> select * from learn1.t;
+------+
| a    |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
|   12 |
+------+
6 rows in set (0.00 sec)

注意: 对于InnoDB存储引擎来说,其支持扁平事务、带有保存点的扁平事务、链事务、分布式事务。对于嵌套事务,其并不原生支持。(如果在开启多个事务,则下一个事务begin的时候会自动提交上一个事务)