事务处理

一篇关于事务处理的笔记。

事务处理

  • 通过确保成批的 SQL 操作要么完全执行,要么完全不执行,来维护数据库的完整性。

  • 利用事务处理,可以保证一组操作不会中途停止,它们要么完全执行,要么完全不执行。如果没有错误发生,整组语句提交到数据库表;如果发生错误,则进行回退,将数据库恢复到某个已知且安全的状态。

  • 关键词:

    • 事务( transaction )指一组 SQL 语句;
    • 回退(rollback)指撤销指定 SQL 语句的过程;
    • 提交(commit)指将未存储的 SQL 语句结果写入数据库表;
    • 保留点(savepoint)指事务处理中设置的临时占位符,可以对它发布回退(与回退整个事务处理不同)。
  • 可以回退的语句:INSERT、UPDATE、DELETE。

控制事务处理

  • 事务处理的语法:

    • START TRANSACTIONBEGIN :开始一个新的事务;
    • COMMIT:提交当前的事务,提交以后,无法回滚;
    • ROLLBACK:回滚当前的事务,取消对表的操作;
    • SET autocommit:为当前的会话打开或关闭 autocommit 模式,默认打开。
  • 隐式地关闭 autocommit 模式,要用 START TRANSACTION 语句:

1
2
3
4
5
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
-- 在 START TRANSACTION 中, autocommit 模式会暂时的为关闭状态,指导 COMMIT 或者 ROLLBACK 语句被执行。这是 autocommit 模式才会回到之前的状态。

ROLLBACK

  • SQL 的 ROLLBACK 命令用来回退 SQL 语句。
  • 在事务处理块中,DELETE 操作(SELECT 和 UPDATE 一样)并不是最终的结果。

COMMIT

  • 隐式提交(implicit commit):一般的 SQL 语句都是针对数据库表直接执行和编写的,即提交(写或保存)操作是自动进行的。

SAVEPOINT

  • 使用简单的 ROLLBACK 和 COMMIT 语句,就可以写入或撤销整个事务。但是,只对简单的事务才能这样做,复杂的事务可能需要部分提交或回退。
  • 要支持回退部分事务,必须在事务处理块中合适的位置放占位符。
1
2
3
SAVEPOINT identifier;

ROLLBACK TO identifier;
  • SAVEPOINT 越多越好: 保留点越多,越能灵活地进行回退。