炸裂!MySQL 82 张图带你飞 (2)

炸裂!MySQL 82 张图带你飞

在自动提交的模式下,每个 SQL 语句都会当作一个事务执行提交操作,例如我们上面使用的更新语句

update cxuan005 set info='cxuan' where id = 111;

如果想要关闭数据库的自动提交应该怎么做呢?

其实,MySQL 是可以关闭自动提交的,你可以执行

set autocommit = 0;

炸裂!MySQL 82 张图带你飞

然后我们再看一下自动提交是否关闭了,再次执行一下 show variables like 'autocommit' 语句

炸裂!MySQL 82 张图带你飞

可以看到,自动提交已经关闭了,再次执行

set autocommit = 1;

会再次开启自动提交。

这里注意一下特殊操作。

在 MySQL 中,存在一些特殊的命令,如果在事务中执行了这些命令,会马上强制执行 commit 提交事务;比如 DDL 语句(create table/drop table/alter/table)、lock tables 语句等等。

不过,常用的 select、insert、update 和 delete命令,都不会强制提交事务。

手动提交

如果需要手动 commit 和 rollback 的话,就需要明确的事务控制语句了。

典型的 MySQL 事务操作如下

start transaction; ... # 一条或者多条语句 commit;

上面代码中的 start transaction 就是事务的开始语句,编写 SQL 后会调用 commit 提交事务,然后将事务统一执行,如果 SQL 语句出现错误会自动调用 Rollback 进行回滚。

下面我们就通过示例来演示一下 MySQL 的事务,同样的,我们需要启动两个窗口来演示,为了便于区分,我们使用 mysql01 和 mysql02 来命名。

炸裂!MySQL 82 张图带你飞

我们用 start transaction 命令启动一个事务,然后再 cxuan005 表中插入一条数据,此时 mysql02 不做任何操作。涉及的 SQL 语句如下。

start transaction;

炸裂!MySQL 82 张图带你飞

然后执行

select * from cxuan005;

查询一下 cxuan005 中的数据

炸裂!MySQL 82 张图带你飞

嗯。。。很多长度太长了,现在我们把所有的 info 数据都更新为 cxuan 。

update cxuan005 set info='cxuan';

炸裂!MySQL 82 张图带你飞

更新完毕后,我们先不提交事务,分别在 mysql01 和 mysql02 中进行查询,发现只有 mysql01 窗口中的查询已经生效,而 mysql02 中还是更新前的数据

炸裂!MySQL 82 张图带你飞

现在我们在 mysql01 中 commit 当前事务,然后在 mysql02 中查询,发现数据已经被修改了。

除了 commit 之外,MySQL 中还有 commit and chain 命令,这个命令会提交当前事务并且重新开启一个新的事务。如下代码所示

start transaction; # 开启一个新的事务 insert into cxuan005(id,info) values (555,'cxuan005'); # 插入一条数据 commit and chain; # 提交当前事务并重新开启一个事务

上面是一个事务操作,在 commit and chain 键入后,我们可以再次执行 SQL 语句

update cxuan005 set info = 'cxuan' where id = 555; commit;

然后再次查询

select * from cxuan005;

炸裂!MySQL 82 张图带你飞

执行后,可以发现,我们仅仅使用了一个 start transaction 命令就执行了两次事务操作。

如果在手动提交的事务中,你发现有一条 SQL 语句写的不正确或者有其他原因需要回滚,那么此时你就会用到 rollback 语句,它会回滚当前事务,相当于什么也没发生。如下代码所示。

start transaction; delete from cxuan005 where id = 555; rollback;

这里切忌一点:delete 删除语句一定要加 where ,不加 where 语句的删除就是耍流氓。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zypsyx.html