返回顶部
首页 > 资讯 > 数据库 >MySQL事务控制流与ACID特性
  • 467
分享到

MySQL事务控制流与ACID特性

2024-04-02 19:04:59 467人浏览 独家记忆
摘要

目录一、ACID 特性二、事务控制语法 三、事务并发异常 1、脏读 2、不可重复读 3、幻读 四、事务隔离级别 一、ACID 特性 事务处理是一种对必须整批执行的 Mysql 操作的

一、ACID 特性

事务处理是一种对必须整批执行的 Mysql 操作的管理机制,在事务过程中,除非整批操作全部正确执行,否则中间的任何一个操作出错,都会回滚 (Rollback) 到最初的安全状态以确保不会对系统数据造成错误的改动。

mysql 5.5 之后,默认的存储引擎从 MyLSAM 替换成了 InnoDB,这其中的一个重要原因就是因为 InnoDB 支持事务,我们用 SHOW ENGINES 来看一下 Mysql 中对各种存储引擎的描述。

事务最重要的四个特性通常被称为 ACID 特性:
A - Atomicity 原子性: 一个事务是一个不可分割的最小单位,事务中的所有操作要么全部成功,要么全部失败,没有中间状态。原子性主要是通过事务日志中的回滚日志(undo log)来实现的,当事务对数据库进行修改时,InnoDB 会根据操作生成相反操作的 undo log,比如说对 insert 操作,会生成 delete 记录,如果事务执行失败或者调用了 rollback,就会根据 undo log 的内容恢复到执行之前的状态。

C - Consistency 一致性: 事务执行之前和执行之后数据都是合法的一致性状态,即使发生了异常,也不会因为异常引而破坏数据库的完整性约束,比如唯一性约束等。

I - Isolation 隔离性: 每个事务是彼此独立的,不会受到其他事务的执行影响,事务在提交之前对其他事务不可见。隔离性通过事务的隔离级别来定义,并用机制来保证写操作的隔离性,用 mvcC 来保证读操作的隔离性,将在下文详细介绍。

D - Durability 持久性: 事务提交之后对数据的修改是持久性的,即使数据库宕机也不会丢失,通过事务日志中的重做日志(redo log)来保证。事务修改之前,会先把变更信息预写到 redo log 中,如果数据库宕机,恢复后会读取 redo log 中的记录来恢复数据。

二、事务控制语法

MySQL 事务控制有几个重要节点,分别是事务的开启,提交,回滚和保存点。

开启事务代表事务开始执行,语句为 START TRANSACTION 或者 BEGIN,提交事务代表将事务中的所有更新都写到磁盘的物理数据库,事务正常执行结束,语句为 COMMIT,如果发生异常需要回滚,语句为 ROLLBACK。要注意的是,一旦事务已经提交,就不能回滚了,因此,在代码执行过程中捕获到异常的时候需要直接执行 rollback 而不是 commit。

比如 A 向 B 转账 100 元的事务:


// 正常执行,提交
BEGIN; # 开启事务
UPDATE account_balance SET balance = balance - 100.00 WHERE account_name = 'A';
UPDATE account_balance SET balance = balance + 100.00 WHERE account_name = 'B';
COMMIT; # 提交事务

// 发生异常,回滚
BEGIN; # 开启事务
UPDATE account_balance SET balance = balance - 100.00 WHERE account_name = 'A';
UPDATE account_balance SET balance = balance + 100.00 WHERE account_name = 'B';
ROLLBACK; # 事务回滚

在复杂场景中,有时我们不需要全盘回滚整个操作,而是分批执行,回滚到某个节点就好了,相当于是在一个大事务下嵌套了若干个子事务,在 MySQL 中可以使用保留点 SAVEPOINT 来实现。


BEGIN;
insert into user_tbl (id) values (1) ;
insert into user_tbl (id) values (2) ;
ROLLBACK;   # 1,2 都没有写入

BEGIN;
insert into user_tbl (id) values (1) ;
SAVEPOINT s1;
insert into user_tbl (id) values (2) ;
ROLLBACK TO s1;   # 回滚到保留点 s1, 因此 1 成功写入,2 被回滚, 最终结果为 1

RELEASE SAVEPOINT s1; # 释放保留点

顺便提一下,事务有隐式事务(自动提交)和显示事务(必须手动提交)两种,MySQL 默认为隐式事务,会进行自动提交,通过 autocommit 参数来控制。


# 查看变量
SHOW VARIABLES LIKE 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
# 开启自动提交(默认)
SET autocommit = 1;
# 关闭自动提交
SET autocommit = 0;

在自动提交状态下,如果没有显示的开启事务,那每一条 DML 语句都是一个事务,系统会自动对每一条 sql 执行 commit 操作。使用 BEGIN 或 START TRANSACTION 开启一个事务之后,自动提交将保持禁用状态,直到使用 COMMIT 或 ROLLBACK 结束事务之后,自动提交模式会恢复到之前的状态。

关于事务还有另一个参数 completion_type,默认取值为 0 (NO_CHaiN)


# 查看变量
SHOW VARIABLES LIKE 'completion_type';
+-----------------+----------+
| Variable_name   |   Value  |
+-----------------+----------+
| completion_type | NO_CHAIN |
+-----------------+----------+

completion_type = 0: 默认值,执行 commit 后不会自动开启新的事务。
completion_type = 1: 执行 commit 时,相当于执行 COMMIT AND CHAIN,自动开启一个相同隔离级别的事务。
completion_type = 2: 执行 commit 时,相当于执行 COMMIT AND RELEASE,提交事务后自动断开服务器连接。

三、事务并发异常

在实际产线环境下,可能会存在大规模并发请求的情况,如果没有妥善的设置事务的隔离级别,就可能导致一些异常情况的出现,最常见的几种异常为脏读(Dirty Read)、幻读(Phantom Read)不可重复读(Unrepeatable Read)。

1、脏读

脏读指一个事务访问到了另一个事务未提交的数据,如下过程:

  • 假设 a 的值为 1,事务 2 把 a 改为 2,此时事务还未提交
  • 在这个时候,事务 1 读取 a,读得 a 的值为 2,事务 1 读取完成
  • 结果事务 2 回滚了对 a 的修改(或者是未 commit),于是 a 的值变回 1
  • 这就导致事实上 a 的值为 1,但是事务 1 取得的结果为 2,所以事务 1 读到了脏数据,发生脏读

2、不可重复读

不可重复读指一个事务多次读取同一数据的过程中,数据值 内容 发生了改变,导致没有办法读到相同的值,描述的是针对同一条数据 update/delete 的现象,如下过程:

  • 事务 1 读取 a,此时 a = 1
  • 此时事务 2 将 a 修改为 2,并成功提交,改动生效
  • 事务 1 又一次读取 a,此时 a = 2
  • 事务 1 在同一个事务里面两次读取同一个值,数据值内容却发生了改变,发生不可重复读

3、幻读

幻读指一个事务多次读取同一数据的过程中,数据 条数 发生了改变,仿佛产生了幻觉,描述的是针对全表 insert/delete 的现象,如下过程:

  • 事务 1 第一次读取数量,得到 10 条数据
  • 此时事务 2 插入了一条数据并成功提交,改动生效,数据变成 11 条
  • 事务 1 再次读取数量,得到 11 条数据,对事务 1 而言莫名其妙的多了一条,好像产生幻觉了一样,发生幻读

四、事务隔离级别

串行化的事务处理方式当然是最安全的,但是串行无法满足数据库高并发访问的需求,作为妥协,有时不得不降低数据库的隔离标准来换取事务的并发能力,通过在可控的范围内牺牲正确性来换取效率的提升,这种权衡通过事务的隔离级别来实现。

数据库有 4 种事务隔离级别,由低到高依次为 读未提交 Read Uncommitted 读已提交 Read Committed 可重复读 Repeatable Read串行化 Serializable

(1)读未提交 Read Uncommitted
允许读取未提交的内容,这种级别下的查询不会加锁,因此脏读、不可重复读、幻读都有可能发生。
(2)读已提交 Read Committed
只允许读取已提交的内容,这种级别下的查询不会发生脏读,因为脏数据属于未提交的数据,所以不会被读取,但是依然有可能发生不可重复读和幻读。
(3)可重复读 Repeatable Read (MySQL 的默认隔离级别)
使用行级锁来保证一个事务在相同查询条件下两次查询得到的数据结果一致,可以避免脏读和不可重复读,但是没有办法避免幻读。
(4)串行化 Serializable
使用表级锁来保证所有事务的串行化,可以防止所有的异常情况,但是牺牲了系统的并发性。

四种隔离级别中上述三种异常情况的容忍度如下(代表允许,代表禁止):

查看隔离级别的命令为:


SHOW VARIABLES LIKE 'transaction_isolation';
# 或者
SELECT @@global.tx_isolation, @@tx_isolation;

第二种方式可以查看全局和当前会话的隔离级别。

设置隔离级别的命令为:


# 将当前会话的隔离级别设为读未提交
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 
# 将全局的隔离级别设为读未提交
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 

到此这篇关于MySQL 事务详解的文章就介绍到这了,更多相关MySQL内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL事务控制流与ACID特性

本文链接: https://lsjlt.com/news/133395.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL事务控制流与ACID特性
    目录一、ACID 特性二、事务控制语法 三、事务并发异常 1、脏读 2、不可重复读 3、幻读 四、事务隔离级别 一、ACID 特性 事务处理是一种对必须整批执行的 MySQL 操作的...
    99+
    2024-04-02
  • mysql - innoDB、事务、ACID特性
    参考:https://www.bilibili.com/video/BV1ui4y1w7C6from=search&seid=9894164453600625754   InnoDB具有事务,支持4个事务隔离级别,回滚,崩溃修复能力和多版本...
    99+
    2018-05-21
    mysql - innoDB 事务 ACID特性 数据库入门 数据库基础教程 数据库 mysql
  • MySQL事务中的ACID特性是什么
    MySQL事务中的ACID特性是什么?针对这个问题,这篇文章给出了相对应的分析和解答,希望能帮助更多想解决这个问题的朋友找到更加简单易行的办法。一、基础概念事务(Transaction)是指访问并可能更新数...
    99+
    2024-04-02
  • MySQL关系型数据库事务的ACID特性与实现
    目录1. 事务的 ACID 特性详2. MySQL 事务的实现3. Gorm 事务的使用4. Spring 事务的使用1. 事务的 ACID 特性详 ACID 是为保证事务(tran...
    99+
    2022-11-13
    MySQL关系型数据库事务 ACID特性
  • 数据库 事务的特性ACID
    事务(Transaction)是并发控制的基本单位。    所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转帐工作:从一个...
    99+
    2024-04-02
  • MySQL事务的ACID特性以及并发问题方案
    目录一、事务的概念二、ACID特性三、事务并发存在的问题四、事务相关命令一、事务的概念 一个事务是由一条或多条对数据库操作的SQL语句所组成的一个不可分割的单元,只有当事务中所有操作都正常执行完了,整个事务才会被提交给数...
    99+
    2022-07-14
    MySQL事务ACID特性并发问题 MySQL事务ACID特性
  • MySQL事务之ACID特性的实现原理是什么
    小编给大家分享一下MySQL事务之ACID特性的实现原理是什么,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!事务是MySQL等关系型数据库区别于NoSQL的重要方面,是保证数据一致性的重要手段...
    99+
    2024-04-02
  • MySQL事务的ACID特性及并发问题实例分析
    本篇内容主要讲解“MySQL事务的ACID特性及并发问题实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL事务的ACID特性及并发问题实例分析”吧...
    99+
    2024-04-02
  • MySQL事务的ACID特性及并发问题怎么解决
    这篇“MySQL事务的ACID特性及并发问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL事务的ACID特...
    99+
    2023-07-02
  • MySQL事务的定义与特性
    MySQL事务的定义与特性 MySQL是一个开源的关系型数据库管理系统,事务是数据库管理系统中一个非常重要的概念。事务是指一组SQL语句的执行,这些SQL语句要么全部执行,要么全部不执...
    99+
    2024-03-01
    mysql 特性 事务 sql语句
  • 介绍:InnoDB是MySQL默认的事务性存储引擎,具备众多ACID特性,支持完整的ACID事务隔离级别,它的
    作者:禅与计算机程序设计艺术 1.简介 数据库管理系统(DBMS)是一个中心化、集中管理各种数据库资源的系统软件。数据库管理系统包括数据库软件、数据库服务器、数据库管理工具等组成。不同版本的数据库管...
    99+
    2023-10-20
    自然语言处理 人工智能 语言模型 编程实践 开发语言 架构设计
  • 数据库事务与特性
    数据库事务与特性 本文关键字:事务、原子性、一致性、隔离性、持久性事务是数据库中的一个概念,在交易系统和复杂业务中经常被提及。对于简单的增删改查场景,特别是学习阶段,不需要考虑诸如并发、锁等问题,但是我们要对事务的概念及特性有所了解,以便日...
    99+
    2016-08-02
    数据库事务与特性 数据库入门 数据库基础教程 数据库 mysql
  • mysql事务有哪些特性
    小编给大家分享一下mysql事务有哪些特性,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!简介事务是由一组sql语句组成的逻辑处理单元事务四个特性原子性(Atomi...
    99+
    2023-06-22
  • 深入理解 MySQL ——锁、事务与并发控制
    本文首发于vivo互联网技术微信公众号作者:张硕本文对 MySQL 数据库中有关锁、事务及并发控制的知识及其原理做了系统化的介绍和总结,希望帮助读者能更加深刻地理解 MySQL 中的锁和事务,从而在业务系...
    99+
    2024-04-02
  • MySQL事务的隔离级别与并发控制
    标题:深入探讨MySQL事务的隔离级别与并发控制 随着数据库应用场景的日益复杂,事务的隔离级别与并发控制成为了数据库管理中不可或缺的重要话题。MySQL作为一款广泛使用的关系型数据库管...
    99+
    2024-03-01
    mysql 并发 事务 并发访问
  • 一文搞懂MySQL事务特性
    本文主要给大家简单讲讲MySQL事务特性,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望MySQL事务特性这篇文章可以给大家带来一些实际帮助。事务特性ACID...
    99+
    2024-04-02
  • mysql事务的特性有哪些
    MySQL事务具有以下特性:1. 原子性(Atomicity):事务是一个原子操作,要么全部执行成功,要么全部执行失败,不存在部分执...
    99+
    2023-08-18
    mysql
  • MySQL之并发控制和事务
    并发控制锁粒度:表级锁行级锁锁:读锁:共享锁,只读不可写,多个读互不阻塞,写锁:独占锁,排它锁,一个写锁会阻塞其它读和写锁实现存储引擎:自行实现其锁策略和锁粒度服务器级:实现了锁,表级锁;用户可显式请求分类...
    99+
    2024-04-02
  • postgresql事务处理与并发控制
    postgresql事务处理与并发控制:事务是postgresql中的基本工作单元,是用户定义的一个数据库操作序列。这些操作要么全做,要么全不做,是一个不可分割的工作单位。在postgresql中,事务管理...
    99+
    2024-04-02
  • MySQL事务与并发控制的知识点有哪些
    这篇文章主要介绍了MySQL事务与并发控制的知识点有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL事务与并发控制的知识点有哪些文章都会有所收获,下面我们一起来看看吧。事务概念一个事务可以理解为一组...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作