如何使用事务

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 如何使用事务

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

显式事务

步骤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 :


169b06531c104681b714d6e8ba2a665a.png

当然,如果我们想关闭这种 自动提交 的功能,可以使用下边两种方法之一:


       显式的的使用 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 行数据):


5d058cd510594a659be07e205a746e6b.png

情况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 行数据):


b5f933f852cb4989a98b84c8d62186ae.png

情况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 行数据):

5c76e71fbc164bcb96d7f62654c4da68.png

 当我们设置 autocommit=0 时,不论是否采用 START TRANSACTION 或者 BEGIN 的方式来开启事 务,都需要用 COMMIT 进行提交,让事务生效,使用 ROLLBACK 对事务进行回滚。


 当我们设置 autocommit=1 时,每条 SQL 语句都会自动进行提交。 不过这时,如果你采用 START TRANSACTION 或者 BEGIN 的方式来显式地开启事务,那么这个事务只有在 COMMIT 时才会生效, 在 ROLLBACK 时才会回滚。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
SQL 安全 关系型数据库
MySQL数据库——事务-简介、事务操作、四大特性、并发事务问题、事务隔离级别
MySQL数据库——事务-简介、事务操作、四大特性、并发事务问题、事务隔离级别
67 1
|
4月前
|
Java 数据库连接 数据库
Spring事务简介,事务角色,事务属性
Spring事务简介,事务角色,事务属性
42 2
|
XML Java 数据库
Spring 事务传播机制、隔离级别以及事务执行流程源码结合案例分析(下)
Spring 事务传播机制、隔离级别以及事务执行流程源码结合案例分析(下)
117 0
Spring 事务传播机制、隔离级别以及事务执行流程源码结合案例分析(下)
|
SQL Oracle Java
Spring 事务传播机制、隔离级别以及事务执行流程源码结合案例分析(上)
Spring 事务传播机制、隔离级别以及事务执行流程源码结合案例分析
73 0
|
SQL 关系型数据库 MySQL
带你理解事务(上)、基本概念
带你理解事务(上)、基本概念
72 0
|
存储 SQL 关系型数据库
事务简介
事务简介
91 0
|
Java Spring
代码如何实现事务查询
代码如何实现
117 0
|
存储 关系型数据库 MySQL
数据库事务概述
数据库事务概述
数据库事务概述
|
NoSQL Redis 开发者
事务-事务的工作流程|学习笔记
快速学习事务-事务的工作流程
事务-事务的工作流程|学习笔记
|
存储 SQL 关系型数据库
事务使用场景详解
事务使用场景详解
534 0
事务使用场景详解