一、前言

默认情况下,MySQL 是以自动提交的(autocommit)模式运行,这种模式下会在每条语句执行完毕后把它作出的修改立刻提交给数据库并使之永久化。这相当于把每一条语句都当做一个事务来执行。如果需要明确的 commit 和 rollback 来提交和回滚事务,那么就需要明确的事务控制命令来开始事务。

MySQL 通过 set autocommitstart transactioncommitrollback 等语句支持本地事务。

实验版本:MySQL5.7

MySQL 5.1 之前的版本中,默认的搜索引擎是 MyISAM,从 MySQL 5.5 之后的版本中,默认的搜索引擎变更为 InnoDB

MyISAM 并不支持事务以及行级锁,它是表级锁

InnoDB 支持行锁、表锁。默认是行锁,行锁是实现在索引上的,如果没有索引,就没法使用行锁,将退化为表锁。

执行

1
show variables like 'autocommit';

查看是否开启自动提交

二、实验

挂起当前的自动提交模式,启动一个新事务

1
start transaction;

执行

1
2
3
use typecho;

update typecho_contents set views=999 where cid=3;

查看当前会话,数据是被修改的

1
select views from typecho_contents where cid=3;

创建一个连接会话查看,数据没有被修改

1、尝试回滚

1
rollback;

数据恢复,此次事务结束,恢复到开始本次事务的start transaction;语句被执行之前的状态

再次尝试提交

1
update typecho_contents set views=999 where cid=3;

发现 MySQL 已经恢复到自动提交(autocommit)的模式运行事务,事务被成功提交

2、测试提交

挂起当前的自动提交模式,开始一个新事务

1
2
3
4
5
start transaction;

update typecho_contents set views=53 where cid=3;

commit;

查看数据

1
select views from typecho_contents where cid=3;

提交成功

3、说明

start transaction; 语句”挂起”自动提交模式的含义是:在事务被提交(commit)或回滚(rollback)之后,该模式将恢复到开始本次事务的start transaction;语句被执行之前的状态。(如果自动提交模式原来是激活的,结束事务将让你回到自动提交模式;如果它原来是禁用的,结束当前事务将开始下一个事务)

4、使用 autocommit=0 测试

关闭自动提交

1
2
3
4
5
set autocommit = 0;

update typecho_contents set views=100 where cid=3;

commit;

再次尝试

1
update typecho_contents set views=200 where cid=3;

发现仍需要手动 commit; 后事务才会被提交,此时

1
show variables like 'autocommit';

autocommit 仍然是 OFF关闭状态,只有在关闭此次会话连接后,恢复到自动提交模式,即autocommitON