沫言|解读数据库:深入分析MySQL中事务以及MVCC的实现原理( 二 )

  • ROLLBACK TO[SAVEPOINT] identifier:回滚到指定保存点 。
  • COMMIT和COMMIT WORK的区别这两个都能提交一个事务 , 区别就在于提交事务之后的操作 , 同样的还有ROLLBACK和ROLLBACK WORK , 主要是通过一个变量来控制:completion_type , 可以执行下面的sql来查看结果:
    SHOW VARIABLES LIKE '%completion_type%';completion_type有如下三种结果:
    沫言|解读数据库:深入分析MySQL中事务以及MVCC的实现原理举个栗子1:
    SET completion_type=1; --1begin;--2INSERT test2 VALUES(1,'张1');--3commit work;--4INSERT test2 VALUES(2,'张1');--5select * from test2;--6rollback;--7select * from test2;--8第4条语句中 , 我们提交了一个事务 , 第5条语句中我们又插入了一条数据 , 此时第六条语句可以查询出2条数据 , 接下来我们回滚 , 语句8再去查询就会发现只剩一条数据了 , 因为语句6倍回滚了 , 我们在语句4之后并没有显示的开启一个事务 , 这就说明语句4自动开启了一个新的事务 。
    举个栗子2:
    SET completion_type=2;begin;INSERT test2 VALUES(3,'张1');commit work;select * from test2;最后一条语句返回如下结果:
    沫言|解读数据库:深入分析MySQL中事务以及MVCC的实现原理先提示的断开连接 , 然后自动重连 。 测试这个例子的时候用工具比如sqlyog可能会不是很明显 , 因为工具会自动帮忙重连 , 看起来就好像没断开一样 , 建议用命令窗口的形式测试
    事务的分类从事务的理论角度来说 , 我们可以把事务分为以下五大类:
    扁平事务这种是最简单也是最常用的一种事务 , 这种事务中的所有操作都是原子的 , 要么全部成功 , 要么什么都不做 。
    带有保存点的扁平事务这种一般比较适合于长事务 , 事务处理到后面报错的时候 , 我们可以选择不全部回滚事务 , 而是回滚到我们自定义好的某一个保存点 。 如下例子:
    BEGIN;INSERT test VALUES(1,'张1');SAVEPOINT AINSERT test VALUES(2,'张2');ROLLBACK TO ACOMMIT;上面示例语句中 , 我么你定义了一个保存点A , 然后在后面又回滚到A , 这时候提交事务 , 那么第二条插入语句是失败的 , 而第一条语句是成功的 。
    注意:回滚到指定保存点之后 , 事务仍然还在活动状态 , 我们依然需要执行COMMIT或者ROLLBACK语句才算结束了事务
    链事务在提交一个事务之后 , 释放掉我们不需要的数据 , 将必要的数据隐式的传给下一个事务 。 (注意:提交事务操作和开始下一个事务操作是一个原子操作)这就意味着下一个事务能看到上一个事务的结果 。
    链事务可以看成带有保存点的特殊事务 , 他们的区别就是带有保存点的事务可以回滚到任意保存点 , 但是回滚之后事务仍然活跃 , 需要执行COMMIT或者ROLLBACK之后才结束事务 , 而链事务中只能回滚到最近的一个保存点(即开始事务的点) 。
    链事务可以通过上面的completion_type参数来实现 。 上文中有举例使用方法 , 这里就不重复举例了 。
    嵌套事务嵌套事务就是说一个事务之中嵌套另一个事务 , 事务之间存在父子关系 , 子事务的提交之后并不生效 , 需要等到父事务提交之后才会生效 。
    需要注意的是MySQL原生并不支持嵌套事务 , 但是可以通过保存点模拟嵌套事务 , 只是说这么模拟的话就没有真正的嵌套事务这么灵活 。
    分布式事务分布式事务通常就是在分布式环境下 , 多个数据库下运行不同的扁平事务 。 多个数据库环境下运行的扁平事务就合成了一个分布式事务 。


    推荐阅读