回滚一个事务指将事务的修改全部撤销。可以回滚当前整个未提交事务,也可以回滚到事务中任意一个保存点。如果要回滚到某个保存点,必须结合使用 ROLLBACK 和 TO SAVEPOINT 语句。

如果回滚整个事务:

  • 事务会结束。
  • 所有的修改会被丢弃。
  • 清除所有保存点。
  • 释放事务持有的所有锁。

如果回滚到某个保存点:

  • 事务不会结束。
  • 保存点之前的修改被保留,保存点之后的修改被丢弃。
  • 清除保存点之后的保存点(不包括保存点自身)。
  • 释放保存点之后事务持有的所有锁。

示例:ROLLBACK 回滚事务的全部修改

  1. obclient> select * from t_insert;
  2. +----+------+-------+---------------------+
  3. | ID | NAME | VALUE | GMT_CREATE |
  4. +----+------+-------+---------------------+
  5. | 1 | CN | 10001 | 2020-04-02 17:52:31 |
  6. | 2 | US | 10002 | 2020-04-02 17:52:38 |
  7. | 3 | EN | 10003 | 2020-04-02 17:52:38 |
  8. +----+------+-------+---------------------+
  9. 3 rows in set (0.00 sec)
  10. obclient> insert into t_insert(id, name, value) values(4,'JP',10004);
  11. Query OK, 1 row affected (0.00 sec)
  12. obclient> insert into t_insert(id, name, value) values(5,'FR',10005),(6,'RU',10006);
  13. Query OK, 2 rows affected (0.00 sec)
  14. Records: 2 Duplicates: 0 Warnings: 0
  15. obclient> select * from t_insert;
  16. +----+------+-------+---------------------+
  17. | ID | NAME | VALUE | GMT_CREATE |
  18. +----+------+-------+---------------------+
  19. | 1 | CN | 10001 | 2020-04-02 17:52:31 |
  20. | 2 | US | 10002 | 2020-04-02 17:52:38 |
  21. | 3 | EN | 10003 | 2020-04-02 17:52:38 |
  22. | 4 | JP | NULL | 2020-04-02 17:53:34 |
  23. | 5 | FR | 10005 | 2020-04-02 17:54:53 |
  24. | 6 | RU | 10006 | 2020-04-02 17:54:53 |
  25. +----+------+-------+---------------------+
  26. 6 rows in set (0.00 sec)
  27. obclient> rollback;
  28. Query OK, 0 rows affected (0.00 sec)
  29. obclient> select * from t_insert;
  30. +----+------+-------+---------------------+
  31. | ID | NAME | VALUE | GMT_CREATE |
  32. +----+------+-------+---------------------+
  33. | 1 | CN | 10001 | 2020-04-02 17:52:31 |
  34. | 2 | US | 10002 | 2020-04-02 17:52:38 |
  35. | 3 | EN | 10003 | 2020-04-02 17:52:38 |
  36. +----+------+-------+---------------------+
  37. 3 rows in set (0.00 sec)