MySQL必知必会-23MySQL事务

管理事务
InnoDB支持事务,而MyISAM不支持。
事务处理可以用来维护数据库的完整性,它保证成批的MySQL操作要么完全执行,要么完全不执行。
如果没有错误发生,整组语句提交给(写到)数据库表。如果发生错误,则进行回退(撤销)以恢复数据库导某个已知且安全的状态。

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

使用ROLLBACK
MySQL的ROLLBACK命令用来回退(撤销)MySQL语句,看下面的语句:

  1. SELECT * FROM orderitems;
  2. START TRANSACTION;
  3. DELETE FROM orderitems;
  4. SELECT * FROM orderitems;
  5. ROLLBACK;
  6. SELECT * FROM orderitems;

首先执行一条SELECT显示该表不为空,然后开始一个事务处理,用一条DELETE语句删除orderitems中所有的行。另一条SELECT语句验证orderitems确实为空。这时用一条ROLLBACK语句回退START TRANSACTION之后的所有语句。最后一条SELECT语句显示该表不为空。

INSERT、UPDATE和DELETE语句可以回退,而CREATE或DROP操作不能回退。

使用COMMIT
一般的MySQL语句都是直接针对数据库表执行和编写的。这就是所谓的隐含提交(implicit commit),即提交(写或保存)操作是自动进行的。
在事务处理块中,提交不会隐含地进行。为进行明确的提交,使用commit语句。
例如,由于涉及实际的数据库操作,这里只做大概的范例。


  1. START TRANSACTION;
  2. 一般性SQL语句.....
  3. ..
  4. COMMIT;
最后的COMMIT语句仅在不出错时写出更改。如果一般性SQL语句第一条SQL起作用,但第二条失败,则DELETE不会提交(实际上,它是自动撤销的)。

隐含事务关闭
当COMMIT或ROLLBACK语句执行后,事务会自动关闭

使用保留点
简单的ROLLBACK和COMMIT语句就可以写入或撤销整个事务处理。
但是更复杂的事务处理可能需要部分提交或回退。
为了占位符,可如下使用:

  1. SAVEPOINT deletel;
为了回退到给出的保留点

  1. ROLLBACK TO deletel;
保留点再事务处理完成(执行一条ROLLBACK或COMMIT)后自动释放。自MySQL5 以来,也可以使用RELEASE SAVEPOINT明确地释放保留点。

更改默认的提交行为
正如所述,默认的MySQL行为是自动提交所有更改。换句话说,任何时候执行一条MySQL语句,该语句实际上都是针对表执行的,而且所做的更改立即生效。为指示MySQL不自动提交更改,需要如下语句:

  1. SET autocommit = 0;
autocommit标志决定是否自动提交更改,不管有没有COMMIT语句。设置autocommit为0(假)指示MySQL不自动提交更改(直到autocomit被设置为真为止)

autocommit标志是针对每个连接而不是服务器的。

你可能感兴趣的:(MySQL)