如何使用事务

举报
yd_249383650 发表于 2023/03/23 22:27:59 2023/03/23
【摘要】 ​使用事务有两种方式,分别为 显式事务 和 隐式事务 。显式事务 步骤1 START TRANSACTION 或者 BEGIN ,作用是显式开启一个事务。BEGIN;START TRANSACTION;START TRANSACTION 语句相较于 BEGIN 特别之处在于,后边能跟随几个 修饰符 :READ ONLY :标识当前事务是一个 只读事务 ,也就是属于该事务的数据库操作只能读取数...

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

显式事务 

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。