一、事务概述
- 事务处理可以用来维护数据库的完整性,它保证成批的MySQL操作要么全部执行,要么全部不执行
- 事务处理是一种机制,用来管理必须成批执行的MySQL操作,以保证数据库不包含不完整的操作结果。利用事务处理,可以保证一组操作不会中途停止,它们或者作为整体执行,或者完全不执行(除非明确指示)。如果没有错误发生,整租语句提交给数据库。如果发生错误,则进行回退(撤销)以恢复数据库到某个已知且安全的状态
并非所有引擎都支持事务处理
- 只有InnoDB存储引擎才支持事务处理
几个关键词
- 事务(transaction):指一组SQL语句
- 回退(rollback):指撤销指定SQL语句的过程
- 提交(commit):指将未存储的SQL语句结果写入数据库表
- 保留点(savepoint):指事务处理中设置的临时占位符(place-holder),你可以对它发布回退(与回退整个事务处理不同)
二、事务的开始(start transaction)
- MySQL使用下面的语句来标识事务的开始
start transaction;
三、事务的回退(rollback)
- MySQL使用rollback命令来进行回退(撤销)语句
- 当使用rollback之后,本次事务会自动关闭
哪些语句可以回退?
- insert、update、delete语句可以进行回退
- 不能回退select语句(这样做也没什么意义)
- 不能回退create或drop操作
演示案例
- 例如下面执行delete之后,我们将事务进行回退,结束之后
select * from ordertotals; start transaction; delete from ordertotals; select * from ordertotals; rollback; select * from ordertotals;
四、事务的提交(commit)
- 事务处理中,当所有的事务处理完成之后,可以使用commit来提交(结束)本次事务
- 当事务提交之前,如果语句出现了错误,那么本次事务会自动停止
演示案例
start transaction; delete from orderitems where order_num=20010; delete from orders where order_num=20010; commit;
隐含事务关闭
- 当commit或rollback语句执行后,事务会自动关闭
五、使用保留点(savepoint)
- 可以使用savepoint设置保留点,当事务进行回退(rollback)时,只需要回退到某个保留点即可
设置保留点
savepoint 保留点名称;
回退到保留点
rollback to 保留点名称;
释放保留点
- 保留点在事务处理完成(执行一条rollback或commit)会自动释放。但是你也可以使用release savepoint来明确释放保留点
release savepoint 保留点名称;
六、更改默认的提交行为(autocommit)
- MySQL语句执行时,默认会提交执行的MySQL语句,但是你也可以更改autocommit标志来指明是否自动提交SQL语句
- autocommit是针对单个连接的,而不是只针对整个服务器的
--设置默认提交(MySQL的默认行为)
set autocommit=1;
--设置默认不提交
set autocommit=0;