MySQL事务小结(二)

MySQL 中使用 start transaction 和 rollback 可以进行事务操作,将多个更新操作打包为一个原子性操作。但当遇到事务内细粒度的控制时,就显得比较无力了。因此,MySQL 提供了单个事务内通过标记来进行更细粒度控制的语句。

存储点标记

就像游戏中的存储节点一样,我们可以通过以下语句来在一个开启的事务内声明标记一个存储点,以便为事务内部分回滚操作提供标记:

savepoint point_name;

该语句在事务内插入了一个标记位,当遇到回滚到指定存储点的命令且两者之间未进行提交操作时,将撤销两者间的全部数据更新操作。

回滚到指定存储点

当需要进行事务内部分操作的回滚时,可以使用以下语句:

rollback to savepoint point_name;

该语句将撤销从当前语句追溯至对应 savepoint 声明处全部未提交的数据更新操作。如果部分回滚语句前有 提交语句或全部回滚的语句出现,将会完成当前事务,此时若执行部分回滚将会提示 "SAVEPOINT point_name does not exist" 的错误。

解除指定存储点

当确认存储点语句不再需要部分回滚的操作后,可执行以下语句解除指定的存储点:

release savepoint point_name;

执行了解除语句后该存储点将不再可用,无法再执行对应的部分回滚语句,否则将会提示 "SAVEPOINT point_name does not exist" 的错误。

一个事务内可以存在多个 savepoint,以此来将一个大的事务划分成多个小的内嵌可回滚的事务代码块或代码层次,如:

start transaction;

insert into table1 values('a1', 'b1');

savepoint p1;
insert into table1 values('a2', 'b2');
rollback to savepoint p1;

savepoint p2;
insert into table1 values('a3', 'b3');
rollback to savepoint p2;

commit;

或者

start transaction;

insert into table1 values('a1', 'b1');

savepoint p1;
insert into table1 values('a2', 'b2');

savepoint p2;
insert into table1 values('a3', 'b3');
rollback to savepoint p2;

rollback to savepoint p1;

commit;

但多个事务块不能形成交叉,如:

start transaction;

insert into table1 values('a1', 'b1');

savepoint p1;
insert into table1 values('a2', 'b2');

savepoint p2;
insert into table1 values('a3', 'b3');

rollback to savepoint p1;

rollback to savepoint p2;

commit;

否则将导致先回滚的代码 p1 事务块撤销了其中的 p2 存储点的声明语句,而导致 p2 事务块回滚时提示 "SAVEPOINT p2 does not exist" 的错误。

转载于:https://my.oschina.net/u/1156626/blog/1785322

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值