前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何使用事务

如何使用事务

作者头像
一个风轻云淡
发布2022-11-15 17:31:09
3520
发布2022-11-15 17:31:09
举报
文章被收录于专栏:java学习java

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

显式事务 

步骤1

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

代码语言:javascript
复制
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:  

代码语言:javascript
复制
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:  

代码语言:javascript
复制
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:

代码语言:javascript
复制
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 时才会回滚。  

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 显式事务 
    • 步骤1
      • 步骤2
        • 步骤3
        • 隐式事务 
        •  隐式提交数据的情况
        • 使用举例1:提交与回滚
          • 情况1:  
            • 情况2:  
              • 情况3:
              相关产品与服务
              云数据库 SQL Server
              腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档