MySQL支持几种基本的数据库引擎。其中MyISAM和InnoDB是两种最常使用的引擎。前者不支持明确的事务处理管理,而后者支持。如果你的应用中需要事务处理功能,则一定要使用正确的引擎类型。
基本术语:
- 事务(transaction)指一组SQL语句;
- 回退(rollback)指撤销指定SQL语句的过程;
- 提交(commit)指将未存储的SQL语句结果写入数据库表;
- 保留点(savepoint)指事务处理中设置的临时占位符,你可以对它发布回退(与回退整个事务处理不同)。
1、事务回退
MySQL的ROLLBACK命令用来回退MySQL语句。
START TRANSACTION
DELETE
FROM tbl_emp
WHERE id = 1
ROLLBACK
分析:这条语句第一句表示开启事务,3-5句就是正常的删除语句,删除了id为1的员工,如果我们这个时候查tbl_emp表的时候,发现id为1的员工已经被删除了。然后最后一句是事务回滚,表示前面执行的sql语句无效。我们再次查tbl_emp表时,会发现id为1的员工那行数据已经恢复。
注意:ROLLBACK不能回退CREATE或DROP操作,就算你执行了回退,它们也不会被撤销。
2、事务提交
我们在编写一般的MySQL语句时,MySQL会自动帮我们提交。这就是隐含提交,即提交操作是自动进行的。但是,在事务处理块中,提交不会隐含地进行,我们需要手动使用COMMIT语句提交事务。
START TRANSACTION
DELETE FROM tbl_emp WHERE id = 9
DELETE FROM tbl_dept WHERE id = 6
COMMIT
分析:这条语句的最后语句就是提交事务语句。最后的COMMIT语句仅在不出错时执行。如果第一条DELETE起作用,但第二条失败,则DELETE不会提交,会自动进行回滚。
注意:在执行前面的语句,但是还没提交事务的时候,执行事务的线程查询tbl_emp表时会发现id为9的员工和id为6的部门已经被删除了。如果是别的线程查询该表时,会发现该员工和部门并没有被删除,这跟MySql的隔离级别有关系(后面的MySql章节会详细讲到),只有提交了事务之后,别的线程才可以发现该员工和部门被删除了。
3、使用保留点
简单的ROLLBACK和COMMIT语句就可以写入或撤销整个事务处理。但是,只是对简单的事务处理才能这样做,更复杂的事务处理可能需要部分提交或回退。
START TRANSACTION
DELETE FROM tbl_emp WHERE id = 9;
SAVEPOINT delete1;
DELETE FROM tbl_dept WHERE id = 6;
ROLLBACK TO delete1
分析:SAVEPOINT delete1 指定名称delete1为保留点,执行完最后一条语句时,事务将会回滚到名称delete1的保留点,也就是第一条DELETE语句生效,第二条DELETE不生效。保留点在事务处理完成后自动释放。
4、更改默认的提交行为
前面说到,自动提交是MySQL的默认行为,也就是每条sql语句都会自动提交。当我们不希望MySql自动提交,而是我们手动提交的时候,需要执行以下语句:
SET AUTOCOMMIT = 0
注意:autocommit标志是针对每个连接而不是服务器的。