MySQL:事务处理
禁止码迷,布布扣,豌豆代理,码农教程,爱码网等第三方爬虫网站爬取!
事务处理
先下个定义,对于一组 MySQL 语句就被称之为事务。那么我们在事务中经常会做很多的操作,但是我们并不能保证这些操作都会被正常执行,可能会有不可知的故障。就例如我希望创建一个空表,然后往其中填入数据,可是有可能在导入数据时出了错,最后得到了一个空表或者表中数据是残缺不全的。这种事情我们不愿意发生,而且也会造成数据碎片,而且 MySQL 是没有撤销操作的。
对于这种故障引发的问题,可以使用事务处理来解决。事务处理可以用来管理一个事务,可以保证一个事务的整体运行,而不会被某个故障而受影响,例如当你创建了一个受损的数据表,就可以用事务处理进行还原。我们需要使用下面的代码启用事务处理:
START TRANSACTION;
需要注意的是,并不是所有引擎都支持事物处理,常用 InnoDB 来支持这个功能,因此我们要先切换一下引擎。
ALTER TABLE table_name ENGINE = InnoDB;
自动提交
默认的 MySQL 语句的提交是自动提交,也就是所有的操作都会直接拿去更新表。我们可以用 SHOW 语句查看是否启用了这个功能。
show variables like 'autocommit';
OFF 表示关闭,ON 表示开启。当操作被自动提交时,事务处理将失去作用,可以把这个功能关掉。
SET autocommit = 0;
需要注意的是,自动提交是对于整个连接而言的,而不是对于服务器。
回滚
所谓回滚操作就是撤销指定的 SQL 语句的过程,这是一种可以将表还原到操作之前的操作,回退操作的语句为:ROLLBACK。回滚操作适用于 INSERT、UPDATE、DELETE 语句,不适用于 SELECT、CREATE、DROP 语句。
让我们调试下,首先调用已有的存储过程制造一些数据。
查看表,确认里面有数据。
启用事务处理。
然后把表中的数据全删了,并确认下有没删干净。
接下来进行回滚操作,发现数据被恢复到启用事务处理前的状态了。
提交
所谓提交就是将未储存的 SQL 语句结果写入表中的操作,也就是说这其中的所有语句都能正常执行时,才会对数据表进行更新。一般对于数据表,MySQL 语句会直接执行,在事务处理中需要用 COMMIT 进行提交才会执行。
在提交或回滚操作执行后,事务处理会被自动关闭。
保留点
更为复杂的操作,可能在一段 MySQL 语句中需要执行这两个操作的地方很多。这个时候你就可以设置保留点来标记对那些部分进行事务处理,设置保留点操作如下:
SAVEPOINT point_name;
保留点的名同样需要唯一,然后回退时就可以只回退到保留点的位置。
ROLLBACK point_name;
一般来说,保留点的设置越多越好,这样处理故障的能力就会越强,性能也会更好。保留点会在事物处理结束后自动被释放,也可以手动释放。
RELRASE SAVEPOINT;
参考资料
《MySQL Crash Course》[英] Ben Forta 著,刘晓霞 钟鸣 译,人民邮电出版社