沫言|解读数据库:深入分析MySQL中事务以及MVCC的实现原理( 二 )
SHOW VARIABLES LIKE '%completion_type%';
completion_type有如下三种结果:举个栗子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;
最后一条语句返回如下结果:先提示的断开连接 , 然后自动重连 。 测试这个例子的时候用工具比如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原生并不支持嵌套事务 , 但是可以通过保存点模拟嵌套事务 , 只是说这么模拟的话就没有真正的嵌套事务这么灵活 。
分布式事务分布式事务通常就是在分布式环境下 , 多个数据库下运行不同的扁平事务 。 多个数据库环境下运行的扁平事务就合成了一个分布式事务 。
- 中国青年报客户端|【青声视语】数据解读:中国经济加快复苏引外媒点赞
- 人民网-环保频道|专家科普解读之二:“限塑”之后,我可以用什么?
- 律师解读公司扔员工证:属公然侮辱他人,情节严重可给予拘留
- 【青声视语】数据解读:中国经济加快复苏引外媒点赞
- 李霄鹏|盘点鲁能冠军主帅,分析李霄鹏差在哪里,解读鲁能绝无可能换帅
- 专家科普解读之二:“限塑”之后,我可以用什么?
- 新华社|门诊共济是自己的"钱"给别人用了吗?权威解读来了
- 医保|医保门诊改革是拿个人的“钱”补统筹基金的窟窿吗?权威解读来了
- 上汽|上汽集团“老大难”| 半年报解读
- 央视新闻客户端|门诊共济改革是“补窟窿”吗?为啥要动个人账户的“钱”?专家解读来了