如何使用事务

使用事务有两种方式,分别为 显式事务 和 隐式事务 。

显式事务 

步骤1

 START TRANSACTION 或者 BEGIN ,作用是显式开启一个事务。

BEGIN;

START TRANSACTION;

START TRANSACTION 语句相较于 BEGIN 特别之处在于,后边能跟随几个 修饰符

READ ONLY :标识当前事务是一个 只读事务 ,也就是属于该事务的数据库操作只能读取数据,而不 能修改数据。  

READ WRITE :标识当前事务是一个 读写事务 ,也就是属于该事务的数据库操作既可以读取数据, 也可以修改数据。

WITH CONSISTENT SNAPSHOT :启动一致性读。

步骤2

一系列事务中的操作(主要是DML,不含DDL)

步骤3

提交事务 或 中止事务(即回滚事务)

# 提交事务。当提交事务后,对数据库的修改是永久性的。

mysql> COMMIT;

扫描二维码关注公众号,回复: 14567843 查看本文章

# 回滚事务。即撤销正在进行的所有没有提交的修改

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 时才会回滚。  

猜你喜欢

转载自blog.csdn.net/m0_62436868/article/details/127168837