MySQL数据库事务的学习(有业务场景案例)

一、事务的基本概念

定义:事务是数据库管理系统执行过程中的一个逻辑单位,由一个或多个SQL语句组成,这些语句作为一个整体一起向系统提交,要么全部执行,要么全部不执行。

二、ACID特性详解

1. 原子性(Atomicity)

定义:事务中的操作要么全部成功,要么全部失败,不会结束在中间某个环节。事务在执行过程中发生错误会被回滚(Rollback)到事务开始前的状态,就像这个事务从未执行过一样。
实现机制:MySQL通过回滚日志(Undo Log)来实现事务的原子性。当事务执行失败时,系统可以利用回滚日志中的数据将事务回滚到事务开始前的状态。

2. 一致性(Consistency)

定义:事务必须使数据库从一个一致性状态变换到另一个一致性状态。事务开始和结束时,数据库的整体状态应该是一致的,即满足所有的完整性约束。
保证机制:MySQL通过约束(如外键约束、主键约束等)和锁(如行锁、表锁等)机制来确保数据的一致性。

3. 隔离性(Isolation)

定义:数据库系统提供一定的隔离机制,使得事务在不受外部并发操作干扰的情况下运行,以保证事务的并发正确性。
隔离级别:MySQL支持四种隔离级别,分别是未提交读(READ UNCOMMITTED)、已提交读(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。不同的隔离级别可以解决不同程度的并发问题,但也会带来不同的性能开销。

4. 持久性(Durability)

定义:一旦事务被提交,它对数据库的修改就是永久性的,即使数据库发生故障也不会丢失。
实现机制:MySQL通过重做日志(Redo Log)来实现事务的持久性。当事务提交时,系统会将事务中对数据库的修改操作记录到重做日志中,并在系统重启时利用这些日志恢复数据。

三、事务的操作流程

开启事务:使用BEGIN或START TRANSACTION语句显式地开启一个事务,或者将autocommit设置为0(关闭自动提交)。
执行事务操作:在事务中执行一系列的SQL语句,这些语句要么全部成功,要么全部失败。
提交事务:如果事务中的所有操作都成功执行,则使用COMMIT语句提交事务,将事务中的修改永久保存到数据库中。
回滚事务:如果事务中的任何操作失败,或者需要撤销已执行的操作,则使用ROLLBACK语句回滚事务,将数据库恢复到事务开始前的状态。

四、事务的并发问题及其解决

在并发环境下,事务之间可能会产生脏读、不可重复读和幻读等问题。MySQL通过不同的事务隔离级别来解决这些问题:

未提交读(READ UNCOMMITTED):最低的隔离级别,允许读取尚未提交的数据,可能会导致脏读。
已提交读(READ COMMITTED):允许在事务中读取已经提交的数据,解决了脏读问题,但可能会出现不可重复读和幻读。
可重复读(REPEATABLE READ):MySQL的默认隔离级别,保证在同一个事务中多次读取同样记录的结果是一致的,解决了脏读和不可重复读问题,但可能会出现幻读。
串行化(SERIALIZABLE):最高的隔离级别,通过强制事务串行执行来避免脏读、不可重复读和幻读问题,但会严重降低并发性能。

五、案例

1.银行转账

场景描述:
在银行系统中,A用户需要向B用户转账1000元。这个操作需要涉及到两个步骤:一是从A用户的账户中扣除1000元,二是向B用户的账户中增加1000元。这两个步骤必须作为一个整体来执行,要么全部成功,要么全部失败,以保证资金的安全和准确。

实现步骤:

开启事务:使用START TRANSACTION或BEGIN语句开启一个事务。
执行转账操作:
从A用户账户扣除1000元:UPDATE accounts SET balance = balance - 1000 WHERE user_id = ‘A’;
向B用户账户增加1000元:UPDATE accounts SET balance = balance + 1000 WHERE user_id = ‘B’;
提交事务:如果两个更新操作都成功执行,则使用COMMIT语句提交事务,将更改永久保存到数据库中。
回滚事务:如果在执行过程中遇到任何错误(如余额不足等),则使用ROLLBACK语句回滚事务,撤销之前的所有更改。

2. 电商订单处理

场景描述: 在电商系统中,用户下单并支付成功后,需要生成订单并减少相应商品的库存。这个过程同样需要保证数据的一致性和完整性。

实现步骤:

开启事务:使用START TRANSACTION或BEGIN语句开启一个事务。
执行订单处理操作:
插入订单记录到订单表中:INSERT INTO orders (user_id, product_id, quantity, …) VALUES (…);
减少商品库存:UPDATE products SET stock = stock - quantity WHERE product_id = …;
提交事务:如果订单记录和库存更新都成功执行,则使用COMMIT语句提交事务。
回滚事务:如果在执行过程中遇到任何错误(如库存不足、支付失败等),则使用ROLLBACK语句回滚事务。

3. 库存管理系统

场景描述:
在库存管理系统中,当某种商品的库存量低于一定阈值时,需要自动触发补货流程。这个流程可能包括多个步骤,如生成补货单、更新库存状态等。

实现步骤:

开启事务:使用START TRANSACTION或BEGIN语句开启一个事务。
执行补货操作:
检查库存量是否低于阈值。
如果低于阈值,则生成补货单并插入到补货单表中:INSERT INTO reorder_orders (product_id, quantity, …) VALUES (…);
更新库存状态为待补货:UPDATE products SET status = ‘pending_reorder’ WHERE product_id = …;
提交事务:如果所有补货操作都成功执行,则使用COMMIT语句提交事务。
回滚事务:如果在执行过程中遇到任何错误(如补货单生成失败、库存状态更新失败等),则使用ROLLBACK语句回滚事务。

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

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

相关文章

node环境安装、vue-cli搭建过程、element-UI搭建使用过程

vue-cli 官方提供的一个脚手架,用于快速生成一个 vue 的项目模板;预先定义好的目录结构及基础代码,就好比咱们在创建 Maven 项目时可以选择创建一个骨架项目,这个骨架项目就是脚手架,我们的开发更加的快速 前端项目架…

探索Python测试的奥秘:nose库的魔法之旅

文章目录 探索Python测试的奥秘:nose库的魔法之旅1. 背景:为什么要用nose?2. nose是什么?3. 如何安装nose?4. 五个简单的库函数使用方法4.1 nose.tools.assert_true4.2 nose.tools.assert_equal4.3 nose.tools.raises4…

html2canvas、pdf-lib、file-saver将html页面导出成pdf

html2canvas、pdf-lib、file-saver将html页面导出成pdf 项目背景 需要根据用户的账号信息,生成一个pdf报告发给客户,要求报告包含echart饼图、走势图等。 方案 使用html2canvas,将页面转成图片,再通过pdf-lib将图片转成pdf文件…

Visual Studio Code离线汉化

从官网下载Visual Studio Code安装包后, 下载Visual Studio Code:https://code.visualstudio.com/ 若因网络等问题无法在线安装语言包,可以尝试离线安装: 从官网下载语言包: Extensions for Visual Studio family …

Stable Diffusion majicMIX_realistic模型的介绍及使用

一、简介 majicMIX_realistic模型是一种能够渲染出具有神秘或幻想色彩的真实场景的AI模型。这个模型的特点是在现实场景的基础上,通过加入一些魔法与奇幻元素来营造出极具画面效果和吸引力的图像。传统意义的现实场景虽然真实,但通常情况下缺乏奇幻性&a…

【网络世界】网络层

目录 🌈前言🌈 📁 网络层 📁 IPV4 📂 什么是IP地址 📂 网段划分 📂 特殊IP 📂 内网和公网 📂 IPV4的危机 📁 IP协议格式 📁 路由 &#x1f…

极限的性质【上】《用Manim可视化》

通过前面的极限的定义,现在是计算极限的时候了。然而,在此之前,我们需要一些极限的性质,这将使我们的工作变得简单一些。我们先来看看这些。 极限的性质: 1.常数对极限的影响 1.首先,我们假设和存在&…

flutter 类似Android 中RelativeLayout在末尾居中

1&#xff0c;Android RelativeLayout中写法&#xff1a; <RelativeLayoutxmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"><Buttonandroid:id&quo…

通过Origin提取图片数据

第一步&#xff1a; Tool --> Digitizer 第二步&#xff1a;点击文件&#xff0c;导入图片 第三步&#xff1a;设置坐标轴位置和数值&#xff08;Edit Aix&#xff09; 滑动鼠标放大图片&#xff0c;将X1移动到0&#xff0c;X2移动到80&#xff0c;Y1移动到97.0&#xff0c…

Kubernetes 上安装 Jenkins

安装 Helm curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash添加 Jenkins Helm 仓库 首先添加 Jenkins Helm 仓库 helm repo add jenkins https://charts.jenkins.io helm repo update安装 Jenkins 使用 Helm 安装 Jenkins 的最新版本&…

Linux下C编程使用动态链接库

为了方便程序功能的后期升级扩展&#xff0c;在程序设计时经常会用到动态库&#xff0c;这样子程序只有到运行阶段才会去加载动态库并且使用库中的函数&#xff0c;那么我们往往只需要更新DLL&#xff08;Windows系统&#xff09;或SO&#xff08;Linux系统&#xff09;文件即可…

tr,cut,diff(数据处理

tr 命令 功能&#xff1a; tr 命令用于转换或删除文件中的字符。 语法&#xff1a; 格式&#xff1a; tr [-cdst][--help][--version][第一字符集][第二字符集] tr [OPTION]…SET1[SET2] 标识符&#xff1a; -d&#xff1a;删除指定的字符。-s&#xff1a;压缩重复的字…

本地部署Xinference实现智能体推理工作流(二)

第二篇章 Dify接入 Xinference 部署的本地模型 1. 安装Dify 克隆 Dify 源代码至本地。 git clone https://github.com/langgenius/dify.git 2. 启动Dify 进入 Dify 源代码的 docker 目录&#xff0c;执行一键启动命令&#xff1a; cd dify/docker cp .env.example .env d…

【OWOD论文】开放世界中OD代码_2_模型部分

简介 本文记录OWOD代码中的模型代码部分。数据部分可看我上一个博客【【OWOD论文】开放世界中OD代码_1_数据部分-CSDN博客】 模型代码 1 起步 在代码中找到 detectron2\engine\defaults.py DefaultTrainer类 __init__方法 根据上述 build_model 回溯到 detectron2\modeling\…

无人机校企合作:组装、维修、研发全面提升学生技能方好就业

无人机校企合作在组装、维修、研发等方面全面提升学生技能&#xff0c;进而促进学生就业&#xff0c;是一个具有前瞻性和实践性的教育模式。以下是对该合作模式的详细分析&#xff1a; 一、合作背景与意义 随着无人机技术的快速发展和广泛应用&#xff0c;市场对无人机专业人…

Maya云渲染平台哪个好,5家云渲染整理

Maya云渲染服务可以帮助用户利用云计算技术&#xff0c;通过互联网访问专业的渲染农场&#xff0c;利用大规模的服务器实现云渲染&#xff0c;比如单镜头同时安排50-300台机器渲染&#xff0c;从而大幅提升渲染效率和便捷性。当然&#xff0c;市面上的渲染农场参差不齐&#xf…

叉车(工业车辆)安全管理系统,云端监管人车信息运营情况方案

近年来&#xff0c;国家和各地政府相继出台了多项政策法规&#xff0c;从政策层面推行叉车智慧监管&#xff0c;加大叉车安全监管力度。同时鼓励各地结合实际&#xff0c;积极探索智慧叉车建设&#xff0c;实现作业人员资格认证、车辆状态认证、安全操作提醒、行驶轨迹监控等&a…

react学习之useState和useEffect

useState useState 可以使函数组件像类组件一样拥有 state&#xff0c;函数组件通过 useState 可以让组件重新渲染&#xff0c;更新视图。 实际使用 setstate()中回调函数的返回值将会成为新的state值回调函数执行时&#xff0c; React会将最新的state值作为参数传递 const A…

Linux基础 -- 网络工具之curl使用

curl 使用手册 curl 是一个强大的命令行工具&#xff0c;用于与服务器进行HTTP请求。本文档将介绍常见的请求方法和一些高级用法。 基础用法 1. GET 请求 GET 请求用于从服务器获取数据。 curl -X GET "http://example.com/api/resource"2. POST 请求 POST 请求…

【HarmonyOS 4.0】@BuilderParam 装饰器

1. BuilderParam 装饰器 BuilderParam 装饰器用于装饰自定义组件(struct)中的属性&#xff0c;其装饰的属性可作为一个UI结构的占位符&#xff0c;待创建该组件时&#xff0c;可通过参数为其传入具体的内容。参数必须满足俩个条件&#xff1a; 2.1 参数类型必须是个函数&#x…