数据库 - MySQL的事务

目录

前言

一、事务的特性

(一)原子性

(二)一致性

(三)隔离性

(四)持久性

二、事务的控制语句

三、事务隔离级别

(一)读未提交

(二)读已提交

(三)可重复读

(四)可序列化

四、使用场景

五、事务操作

(一)开启事务

(二)提交事务

(三)回滚事务

(四)示例

六、自动提交模式

七、隐式提交

八、提交前的保存点

九、注意事项

十、总结


前言

MySQL 中的事务是数据库管理系统中用来确保多个 SQL 操作以原子性的方式执行的机制。事务可以保证一系列操作要么全部成功,要么全部失败,从而保证数据库的一致性和完整性。


一、事务的特性

事务具有四个重要的属性,简称 ACID

(一)原子性

事务中的所有操作要么全部成功,要么全部回滚到事务开始前的状态。如果事务中任何一个操作失败,整个事务都会回滚。

(二)一致性

事务的执行不会破坏数据库的一致性约束。即事务执行前后,数据库都应该处于一致的状态。

(三)隔离性

每个事务的操作在未提交之前,对其他事务是不可见的。事务相互独立,即使并发执行时,事务的执行结果与按顺序执行的结果应当一致。MySQL 通过不同的隔离级别来控制事务的并发执行行为。

(四)持久性

一旦事务提交,数据库中的数据就会被永久保存,即使系统崩溃,事务提交的结果也不会丢失。

二、事务的控制语句

控制语句主要有以下几种:

  • START TRANSACTIONBEGIN:显式开启一个事务。

  • COMMIT:提交事务,表示事务中的所有操作成功执行。

  • ROLLBACK:回滚事务,将数据库状态恢复到事务开始之前。

  • SAVEPOINT:设置一个保存点,以便在回滚时可以部分回滚到某个点。

  • RELEASE SAVEPOINT:删除保存点。

  • SET TRANSACTION:设置事务的隔离级别。

三、事务隔离级别

MySQL 支持四种事务隔离级别,每种级别对并发控制的严格程度不同:

(一)读未提交

事务可以读取其他事务未提交的数据,容易导致脏读的问题。

(二)读已提交

事务只能读取其他事务已经提交的数据,避免了脏读问题,但可能出现不可重复读。

(三)可重复读

事务执行期间,即使其他事务修改了数据,当前事务依然只能看到执行时的快照,避免了不可重复读问题。MySQL 的默认隔离级别是可重复读,同时通过间隙锁机制来防止幻读

(四)可序列化

最严格的隔离级别,所有事务串行化执行,完全避免了脏读、不可重复读和幻读,但并发性能较差。 

四、使用场景

事务通常用于涉及多表操作、转账系统等需要保证数据一致性的场景,例如:

  • 银行转账:从一个账户扣钱,并往另一个账户加钱,这两个操作必须作为一个原子操作执行,任何一个操作失败,整个事务都必须回滚。

  • 订单处理:生成订单时,可能涉及多个表的写操作,比如库存减少、账户扣款、订单创建等,这些操作需要作为一个事务处理。

五、事务操作

事务的开启和提交涉及到控制事务的生命周期。通过显式开启事务,并在事务内执行多个操作,可以确保这些操作要么全部执行成功并提交,要么在失败时回滚所有操作。

(一)开启事务

MySQL 中,可以通过 START TRANSACTIONBEGIN 语句显式开启一个事务。开启事务后,执行的 SQL 操作会被暂时保留,直到提交或回滚。

START TRANSACTION这是标准的 SQL 语法,用于启动一个新的事务。

START TRANSACTION;

BEGIN:MySQL 提供的简写形式,与 START TRANSACTION 等效,用于开启事务。

BEGIN;

此时,MySQL 开始记录事务中的所有操作,直到你决定提交或回滚事务。

(二)提交事务

提交事务意味着将事务中的所有操作永久保存到数据库中。使用 COMMIT 语句可以提交当前事务。

COMMIT;

当事务被提交后,所有的修改都会生效,并且这些修改会对其他事务可见。同时,提交后事务就结束了,后续的操作会作为一个新的事务来处理。

(三)回滚事务

如果在事务过程中发生了错误,或者你决定不保存这些操作的结果,可以使用 ROLLBACK 语句回滚事务。回滚意味着撤销事务中的所有操作,数据库会恢复到事务开始之前的状态。

ROLLBACK;

回滚操作通常用于防止因事务部分失败而导致数据库处于不一致状态。

(四)示例

以下是一个典型的事务使用流程,演示如何开启事务、执行多条操作,并根据情况提交或回滚事务。

-- 1. 显式开启事务
START TRANSACTION;-- 2. 执行多个 SQL 操作
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;-- 3. 提交事务(保存所有更改)
COMMIT;-- 如果某个操作失败,可以回滚整个事务
-- ROLLBACK;

六、自动提交模式

默认情况下,MySQL 处于自动提交模式,这意味着每一条 SQL 语句都会自动被作为一个独立的事务执行,并在执行后立即提交。要显式控制事务,就需要暂时关闭自动提交模式。

关闭自动提交模式

可以通过设置 autocommit0 来关闭自动提交:

SET autocommit = 0;

此时,MySQL 将不会自动提交操作,必须显式通过 COMMITROLLBACK 来结束事务。

-- 手动提交事务
COMMIT;-- 手动回滚事务
ROLLBACK;

恢复自动提交模式

在完成事务处理后,你可以将 autocommit 设置为 1,恢复默认的自动提交行为:

SET autocommit = 1;

七、隐式提交

某些 SQL 语句会导致事务隐式提交,即不需要显式调用 COMMIT,事务会自动提交。常见的隐式提交操作包括:

  • DDL 操作(如 CREATE, DROP, ALTER 等)会在执行前自动提交事务,且在执行后也会自动提交。

示例:

-- 创建表之前,事务会自动提交
CREATE TABLE new_table (id INT);

八、提交前的保存点

在事务中,可以通过 SAVEPOINT 设置一个保存点,便于部分回滚事务。如果不想回滚整个事务,可以使用保存点回滚到某个特定的点。

示例:

-- 开启事务
START TRANSACTION;-- 设置保存点
SAVEPOINT sp1;-- 执行一些操作
INSERT INTO orders (order_id, customer_id, total_amount) VALUES (1002, 1, 300);-- 回滚到保存点 sp1
ROLLBACK TO sp1;-- 提交事务
COMMIT;

九、注意事项

事务的注意事项主要有以下几点:

  • 提交事务后,所有的更改将会永久保存,无法再通过 ROLLBACK 撤销。

  • 自动提交模式默认开启时,每条 SQL 都是独立事务;关闭自动提交后,必须手动调用 COMMITROLLBACK 来结束事务。

  • 在分布式数据库中或多个系统间的事务处理中,还可能涉及到分布式事务,通过二阶段提交(2PC)等机制来保证数据的一致性。

十、总结

  • 使用 START TRANSACTIONBEGIN 来显式开启事务。

  • 通过 COMMIT 提交事务,永久保存修改。

  • 如果事务中发生了问题,可以通过 ROLLBACK 撤销操作,恢复数据库到事务开始前的状态。

  • 在 MySQL 默认的自动提交模式下,所有操作会被自动提交,如果需要手动控制事务,必须关闭自动提交模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/880387.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ | Leetcode C++题解之第429题N叉树的层序遍历

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<int>> levelOrder(Node* root) {if (!root) {return {};}vector<vector<int>> ans;queue<Node*> q;q.push(root);while (!q.empty()) {int cnt q.size();vector<…

【AI学习】Lilian Weng:Extrinsic Hallucinations in LLMs(LLM 的外在幻觉)

来自OpenAI 的 Lilian Weng的《Extrinsic Hallucinations in LLMs》 Date: July 7, 2024 | Estimated Reading Time: 30 min | Author: Lilian Weng 文章链接&#xff1a;https://lilianweng.github.io/posts/2024-07-07-hallucination/ 大概看了一下&#xff0c;这篇文章的核…

深度学习与应用:行人跟踪

**实验 深度学习与应用&#xff1a;行人跟踪 ** ------ **1、 实验目的** ------ - 了解行人跟踪模型基础处理流程 - 熟悉行人跟踪模型的基本原理 - 掌握 行人跟踪模型的参数微调训练以及推理的能力 - 掌握行人跟踪模型对实际问题的应用能力&#xff0c;了解如何在特定的场景和…

MT6765/MT6762(R/D/M)/MT6761(MT8766)安卓核心板参数比较_MTK联发科4G智能模块

联发科Helio P35 MT6765安卓核心板 MediaTek Helio P35 MT6765是智能手机的主流ARM SoC&#xff0c;于2018年末推出。它在两个集群中集成了8个ARM Cortex-A53内核&#xff08;big.LITTLE&#xff09;。四个性能内核的频率高达2.3GHz。集成显卡为PowerVR GE8320&#xff0c;频率…

Snap 发布新一代 AR 眼镜,有什么特别之处?

Snap 发布新一代 AR 眼镜&#xff0c;有什么特别之处&#xff1f; Snap 简介 新一代的 AR 眼镜特点 Snap 简介 Snap 公司成立于 2010 年&#xff0c;2017 年美国东部时间 3 月 2 日上午 11 时许&#xff0c;在纽交所正式挂牌交易&#xff0c;股票代码为 “SNAP”。其旗下的核…

vue循环渲染动态展示内容案例(“更多”按钮功能)

当我们在网页浏览时&#xff0c;常常会有以下情况&#xff1a;要展示的内容太多&#xff0c;但展示空间有限&#xff0c;比如我们要在页面的一部分空间中展示较多的内容放不下&#xff0c;通常会有两种解决方式&#xff1a;分页&#xff0c;“更多”按钮。 今天我们的案例用于…

自建数据库VS云数据库:从《中国数据库前世今生》看未来数据管理的抉择

自建数据库VS云数据库&#xff1a;从《中国数据库前世今生》看未来数据管理的抉择 在数字化时代的滚滚洪流中&#xff0c;数据库作为核心数据管理工具&#xff0c;始终扮演着至关重要的角色。最近观看了纪录片《中国数据库前世今生》&#xff0c;让我对数据库技术的发展有了更…

11. Map和Set

一、二叉搜索树 1. 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根…

Python爬虫之requests模块(一)

Python爬虫之requests模块&#xff08;一&#xff09; 学完urllib之后对爬虫应该有一定的了解了&#xff0c;随后就来学习鼎鼎有名的requests模块吧。 一、requests简介。 1、什么是request模块&#xff1f; requests其实就是py原生的一个基于网络请求的模块&#xff0c;模拟…

甘蔗茎节检测系统源码分享

甘蔗茎节检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

Dependency Check:一款针对应用程序依赖组件的安全检测工具

关于Dependency Check Dependency-Check 是一款软件组合分析 &#xff08;SCA&#xff09; 工具&#xff0c;可尝试检测项目依赖项中包含的公开披露的漏洞。它通过确定给定依赖项是否存在通用平台枚举 &#xff08;CPE&#xff09; 标识符来实现此目的。如果找到&#xff0c;它…

【HTTP】请求“报头”,Referer 和 Cookie

Referer 描述了当前这个页面是从哪里来的&#xff08;从哪个页面跳转过来的&#xff09; 浏览器中&#xff0c;直接输入 URL/点击收藏夹打开的网页&#xff0c;此时是没有 referer。当你在 sogou 页面进行搜索时&#xff0c;新进入的网页就会有 referer 有一个非常典型的用…

绝了,自从用了它,我每天能多摸鱼2小时!

大家好&#xff0c;我是可乐。 俗话说的好&#xff1a;“摸鱼一时爽&#xff0c;一直摸鱼一直爽”。 作为一个程序员&#xff0c;是否有过调试代码熬到深夜&#xff1f;是否有过找不到解决方案而挠秃头顶&#xff1f; 但现在你即将要解放了&#xff0c;用了这款工具——秘塔…

PicoQuant公司的PicoHarp 300停产公告

尊敬的用户&#xff0c;您们好&#xff01; 今天&#xff0c;我们完成了PicoHarp 300最后一份订单&#xff0c;这也是自第一台PicoHarp 300号售出20年后的最后一份订单。 PicoHarp 300作为市场上第一款USB-TCSPC设备&#xff0c;PicoHarp 300已售出约1600台&#xff0c;为Pic…

SpringCloudEureka简介

背景 SpringCloudEureka是基于NetfliEureka做了二次封装&#xff0c;负责微服务架构的服务治理功能。 SpringCloud通过为Eureka增加SpringBoot风格的自动化配置&#xff0c;只需要简单的引入依赖和注解配置&#xff0c;就能让SpringBoot构建的微服务应用轻松和Eureka服务治理体…

安卓13去掉下拉菜单的Dump SysUI 堆的选项 android13删除Dump SysUI 堆

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析3.1 位置13.2 位置24.代码修改5.编译6.彩蛋1.前言 客户需要去掉下拉菜单里面的Dump SysUI 堆图标,不让使用这个功能。 2.问题分析 android的下拉菜单在systemui里面,这里我们只需要定位到对应的添加代…

找到你的工具!5款免费可视化报表工具对比分析

选择合适的可视化工具对于分析和展示数据至关重要&#xff0c;以下是五款免费的可视化工具&#xff0c;它们各具特色&#xff0c;能够适应各种需求。本文将介绍每款工具的优势与不足&#xff0c;帮助你找到最合适的解决方案。 1. 山海鲸可视化 介绍&#xff1a;山海鲸可视化是…

【Linux】当前进展

驱动层日志添加了下文件目录&#xff0c;函数&#xff0c;代码行的打印&#xff08;这里要小心&#xff0c;驱动目录源代码打印日志里边添进程号可能有问题&#xff0c;因为在驱动初始化的时候&#xff0c;内核还没有创建进程&#xff0c;不过猜测可以先不打印进程相关信息&…

计算机网络34——Windows内存管理

1、计算机体系结构 2、内存管理 分为连续分配管理和非连续分配管理 在块内存在的未使用空间叫内部碎片&#xff0c;在块外存在的未使用空间叫外部碎片 固定分区分配可能出现内部碎片&#xff0c;动态分区分配可能出现外部碎片 3、逻辑地址和实际地址的互相转换 4、缺页中断 …

算法.图论-并查集

文章目录 1. 并查集介绍2. 并查集的实现2.1 实现逻辑2.2 isSameSet方法2.3 union方法(小挂大优化)2.4 find方法(路径压缩优化) 3. 并查集模板4. 并查集习题4.1 情侣牵手4.2 相似字符串组 1. 并查集介绍 定义&#xff1a; 并查集是一种树型的数据结构&#xff0c;用于处理一些不…