并非所有引擎都支持事务处理。MyISAM不支持,InnoDB支持。
事务处理可用来维护数据库的完整性,它保证成批的MySQL操作要么完全执行,要么完全不执行。如果没有错误发生,整组语句写到数据库表,如果发生错误,将已经执行的部分语句进行回退,以恢复数据库到某个已知且安全的状态。
术语:
1.事务:一组SQL语句。
2.回退:撤销指定SQL语句。
3.提交:将未存储的SQL语句结果写入数据库表。
4.保留点:指事务处理中设置的临时占位符,可以回退到该点。
标识事务的开始:
START TRANSACTION;
回退MySQL语句:
SELECT语句; -- 查看结果集
START TRANSACTION;
DELETE语句;
SELECT语句; -- 会发现指定行被删除
ROLLBACK; -- 回退删除语句
SELECT语句; -- 删除行又回来了
ROLLBACK只能在一个事务处理内使用。
可以ROLLBACK的语句有INSERT、UPDATE、DELETE。在事务处理块中可以使用CREATE和DROP语句,但执行回退时它们不会被撤销。
一般MySQL语句是直接隐含提交的,在事务处理中,需要显式提交:
START TRANSACTION;
DELETE语句1;
DELETE语句2;
COMMIT;
以上当DELETE语句2失败时,整个事务会被撤销。
COMMIT或ROLLBACK后,事务会自动关闭。
有些事务如果发生了错误,不需要全部回退,可在事务处理块中某一位置放置占位符,如果需要回退,可以回退到某个占位符。
创建占位符:
SAVEPOINT savePointName;
每个保留点都有标识它的唯一的占位符名字,回退到某个保留点:
ROLLBACK TO savePointName
可设置任意多的保留点。
保留点在事务处理完成后自动释放,MySQL 5及以后版本可以用RELEASE SAVEPOINT显式释放保留点。
将MySQL默认的自动提交改为手动提交:
SET autocommit = 0;
aotucommit标志针对每个连接而非服务器。