MySQL的事务相关的语句的使用

MySQL的事务相关的语句的使用

事务是数据库管理系统执行过程中的一个程序单位,由一个或多个数据库操作组成。MySQL作为一款流行的关系型数据库管理系统,支持事务处理,允许用户定义一系列的操作,这些操作要么完全执行,要么完全不执行,保证了数据库的完整性和一致性。

事务的基本概念

事务通常用于处理需要多个步骤的复杂操作,而这些步骤必须完整执行,不能只执行部分。在MySQL中,事务的处理依赖于存储引擎,最常见的支持事务的存储引擎是InnoDB。

事务的四大特性(ACID)

  • 原子性(Atomicity):事务是数据库的基本操作单元,它的原子性保证了操作要么全完成要么全不完成。
  • 一致性(Consistency):事务必须使数据库从一个一致性状态转换到另一个一致性状态。
  • 隔离性(Isolation):事务的执行不应受其他事务的干扰。
  • 持久性(Durability):一旦事务提交,则其所做的修改将永久保存在数据库中。

在MySQL中,你可以使用以下SQL语句来控制事务的开始、执行和结束。

事务基本语法

START TRANSACTION
    [transaction_characteristic [, transaction_characteristic] ...]

transaction_characteristic: {
    WITH CONSISTENT SNAPSHOT
  | READ WRITE
  | READ ONLY
}

BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET autocommit = {0 | 1}

START TRANSACTIONBEGIN

这两个命令用于启动一个新的数据库事务。BEGINSTART TRANSACTION 的简写形式,功能相同。

  • WITH CONSISTENT SNAPSHOT: 在事务开始时创建一个一致性视图。这意味着事务可以看到一个一致的数据库快照,而不受并发事务中的更新操作影响。
  • READ WRITE: 指定事务可以进行读取和写入操作。这是默认设置。
  • READ ONLY: 指定事务只能进行读取操作,不允许写入。这可以优化事务的执行,因为数据库系统知道不需要处理可能的写冲突。

COMMIT

COMMIT 语句用于提交当前事务中的所有更改,使它们成为数据库中的永久更改。

  • WORK: 这是一个可选关键字,用于明确指示提交的是工作事务。通常不是必需的,因为其默认即为操作事务。
  • AND CHAIN: 自动开始一个新的事务,该事务继承当前事务的属性。适用于需要连续处理多个事务的场景。
  • AND NO CHAIN: 结束当前事务后不自动开始新事务。
  • RELEASE: 提交事务并断开当前的数据库连接。
  • NO RELEASE: 提交事务但不断开数据库连接。

ROLLBACK

ROLLBACK 语句用于撤销当前事务中的所有更改,回到事务开始前的状态。

  • COMMIT 类似,ROLLBACK 也可以用 WORK, AND CHAIN, AND NO CHAIN, RELEASE, NO RELEASE 这些选项来控制事务的结束行为和连接的状态。

SET autocommit

SET autocommit 用于控制MySQL的自动提交行为。当 autocommit 设置为1时,每个SQL语句都会被视为一个独立的事务并自动提交。设置为0时,SQL语句不会自动提交,需要显式使用 COMMIT 来提交事务。

  • SET autocommit = 0;: 关闭自动提交。
  • SET autocommit = 1;: 开启自动提交。

常用的事务控制语句

开始一个事务

事务的开始通常使用START TRANSACTIONBEGIN声明。

sql 复制代码
START TRANSACTION;
-- 或者
BEGIN;

提交一个事务

提交事务意味着所有在事务块内的语句都被执行,并且修改永久保存到数据库中。

sql 复制代码
COMMIT;

回滚一个事务

如果在执行事务过程中发生错误或者用户主动决定取消事务的执行,可以使用ROLLBACK语句来撤销所有未提交的修改。

sql 复制代码
ROLLBACK;

设置保存点

在事务中,你可以通过设置保存点(SAVEPOINT)来进行局部的回滚。这是非常有用的功能,可以在事务中的任何点保存当前状态,之后你可以回滚到这个状态而不影响其他的操作。

sql 复制代码
SAVEPOINT savepoint_name;
ROLLBACK TO savepoint_name;

释放保存点

如果确定不再需要某个特定的保存点,可以使用RELEASE SAVEPOINT语句来释放它。

sql 复制代码
RELEASE SAVEPOINT savepoint_name;

设置事务的隔离级别

为了控制事务如何通过锁定机制与其他事务隔离,可以设置事务的隔离级别。MySQL支持以下四种隔离级别:

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ(默认级别)
  • SERIALIZABLE

设置隔离级别的语句如下:

sql 复制代码
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

示例:使用事务处理

考虑一个银行转账的场景,其中涉及到两个账户的余额更新。这里展示如何使用事务来确保操作的原子性。

sql 复制代码
START TRANSACTION;

UPDATE accounts SET balance = balance - 100 WHERE name = 'Alice';
UPDATE accounts SET balance = balance + 100 WHERE name = 'Bob';

-- 如果以上操作都成功执行,提交事务
COMMIT;

-- 如果有任何错误发生,回滚事务
ROLLBACK;

参考链接

相关推荐
刘大浪10 分钟前
后端数据增删改查基于Springboot+mybatis mysql 时间根据当时时间自动填充,数据库连接查询不一致,mysql数据库连接不好用
数据库·spring boot·mybatis
无敌岩雀17 分钟前
MySQL中的索引
数据库·mysql
a_安徒生40 分钟前
linux安装TDengine
linux·数据库·tdengine
东阳马生架构42 分钟前
MySQL原理简介—1.SQL的执行流程
mysql
程序员学习随笔43 分钟前
PostgreSQL技术内幕19:逻辑备份工具pg_dump、pg_dumpall
数据库·postgresql
尘浮生1 小时前
Java项目实战II基于微信小程序的校运会管理系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
偶尔。5351 小时前
什么是事务?事务有哪些特性?
数据库·oracle
安迁岚1 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验六 视图
数据库·sql·mysql·oracle·实验报告
xoxo-Rachel1 小时前
(超级详细!!!)解决“com.mysql.jdbc.Driver is deprecated”警告:详解与优化
java·数据库·mysql
JH30732 小时前
Oracle与MySQL中CONCAT()函数的使用差异
数据库·mysql·oracle