SQL - 事务处理

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标志是针对每个连接而不是服务器的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值