使用事务有两种方式,分别为 显式事务 和 隐式事务 。
显式事务
步骤1
START TRANSACTION 或者 BEGIN ,作用是显式开启一个事务。
BEGIN; START TRANSACTION;
START TRANSACTION 语句相较于 BEGIN 特别之处在于,后边能跟随几个 修饰符 :
READ ONLY :标识当前事务是一个 只读事务 ,也就是属于该事务的数据库操作只能读取数据,而不 能修改数据。
READ WRITE :标识当前事务是一个 读写事务 ,也就是属于该事务的数据库操作既可以读取数据, 也可以修改数据。
WITH CONSISTENT SNAPSHOT :启动一致性读。
步骤2
一系列事务中的操作(主要是DML,不含DDL)
步骤3
提交事务 或 中止事务(即回滚事务)
# 提交事务。当提交事务后,对数据库的修改是永久性的。
mysql> COMMIT;
# 回滚事务。即撤销正在进行的所有没有提交的修改
mysql> ROLLBACK;
# 将事务回滚到某个保存点。
mysql> ROLLBACK TO [SAVEPOINT]
隐式事务
MySQL中有一个系统变量 autocommit :
当然,如果我们想关闭这种 自动提交 的功能,可以使用下边两种方法之一:
显式的的使用 START TRANSACTION 或者 BEGIN 语句开启一个事务。这样在本次事务提交或者回 滚前会暂时关闭掉自动提交的功能。
把系统变量 autocommit 的值设置为 OFF ,就像这样:
SET autocommit = OFF;
#或
SET autocommit = 0;
隐式提交数据的情况
数据定义语言(Data definition language,缩写为:DDL)
隐式使用或修改mysql数据库中的表
事务控制或关于锁定的语句
① 当我们在一个事务还没提交或者回滚时就又使用 START TRANSACTION 或者 BEGIN 语句开启了 另一个事务时,会 隐式的提交 上一个事务。
② 当前的 autocommit 系统变量的值为 OFF ,我们手动把它调为 ON 时,也会 隐式的提交 前边语 句所属的事务。
③ 使用 LOCK TABLES 、 UNLOCK TABLES 等关于锁定的语句也会 隐式的提交 前边语句所属的事 务。
加载数据的语句
关于MySQL复制的一些语句
其它的一些语句
使用举例1:提交与回滚
我们看下在 MySQL 的默认状态下,下面这个事务最后的处理结果是什么。
情况1:
CREATE TABLE user(name varchar(20), PRIMARY KEY (name)) ENGINE=InnoDB; BEGIN; INSERT INTO user SELECT '张三'; COMMIT; BEGIN; INSERT INTO user SELECT '李四'; INSERT INTO user SELECT '李四'; ROLLBACK; SELECT * FROM user;
运行结果(1 行数据):
情况2:
CREATE TABLE user (name varchar(20), PRIMARY KEY (name)) ENGINE=InnoDB; BEGIN; INSERT INTO user SELECT '张三'; COMMIT; INSERT INTO user SELECT '李四'; INSERT INTO user SELECT '李四'; ROLLBACK;
运行结果(2 行数据):
情况3:
CREATE TABLE user(name varchar(255), PRIMARY KEY (name)) ENGINE=InnoDB; SET @@completion_type = 1; BEGIN; INSERT INTO user SELECT '张三'; COMMIT; INSERT INTO user SELECT '李四'; INSERT INTO user SELECT '李四'; ROLLBACK; SELECT * FROM user;
运行结果(1 行数据):
当我们设置 autocommit=0 时,不论是否采用 START TRANSACTION 或者 BEGIN 的方式来开启事 务,都需要用 COMMIT 进行提交,让事务生效,使用 ROLLBACK 对事务进行回滚。
当我们设置 autocommit=1 时,每条 SQL 语句都会自动进行提交。 不过这时,如果你采用 START TRANSACTION 或者 BEGIN 的方式来显式地开启事务,那么这个事务只有在 COMMIT 时才会生效, 在 ROLLBACK 时才会回滚。