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 著,刘晓霞 钟鸣 译,人民邮电出版社

posted @ 2020-05-23 20:13  乌漆WhiteMoon  阅读(238)  评论(0编辑  收藏  举报