在自动提交的模式下,每个 SQL 语句都会当作一个事务执行提交操作,例如我们上面使用的更新语句
update cxuan005 set info='cxuan' where id = 111;如果想要关闭数据库的自动提交应该怎么做呢?
其实,MySQL 是可以关闭自动提交的,你可以执行
set autocommit = 0;然后我们再看一下自动提交是否关闭了,再次执行一下 show variables like 'autocommit' 语句
可以看到,自动提交已经关闭了,再次执行
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 来命名。
我们用 start transaction 命令启动一个事务,然后再 cxuan005 表中插入一条数据,此时 mysql02 不做任何操作。涉及的 SQL 语句如下。
start transaction;然后执行
select * from cxuan005;查询一下 cxuan005 中的数据
嗯。。。很多长度太长了,现在我们把所有的 info 数据都更新为 cxuan 。
update cxuan005 set info='cxuan';更新完毕后,我们先不提交事务,分别在 mysql01 和 mysql02 中进行查询,发现只有 mysql01 窗口中的查询已经生效,而 mysql02 中还是更新前的数据
现在我们在 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;执行后,可以发现,我们仅仅使用了一个 start transaction 命令就执行了两次事务操作。
如果在手动提交的事务中,你发现有一条 SQL 语句写的不正确或者有其他原因需要回滚,那么此时你就会用到 rollback 语句,它会回滚当前事务,相当于什么也没发生。如下代码所示。
start transaction; delete from cxuan005 where id = 555; rollback;这里切忌一点:delete 删除语句一定要加 where ,不加 where 语句的删除就是耍流氓。