MySQL事务小结(二)

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

存储点标记

就像游戏中的存储节点同样,咱们能够经过如下语句来在一个开启的事务内声明标记一个存储点,以便为事务内部分回滚操做提供标记:游戏

savepoint point_name;

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

回滚到指定存储点

当须要进行事务内部分操做的回滚时,可使用如下语句:it

rollback to savepoint point_name;

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

解除指定存储点

当确认存储点语句再也不须要部分回滚的操做后,可执行如下语句解除指定的存储点:table

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;

或者tab

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;

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

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" 的错误。

相关文章
相关标签/搜索