当前位置: 首页 > news >正文

数据库事务

什么是事务

在数据库中,事务(Transaction)是指一组数据库操作,这些操作要么全部成功执行,要么全部失败回滚,是保证数据库操作一致性的基本单位。事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)四个特性。

事务的特性

原子性(Atomicity)

        原子性是指事务中的所有操作要么全部成功完成,要么全部回滚到事务开始前的状态。即事务中的所有操作要么全部执行,要么全部不执行,不会出现执行了一半的情况。

一致性(Consistency)

        一致性是指事务执行前后,数据库的完整性约束没有被破坏。在事务开始和结束时,数据库的完整性约束都得到保持,比如外键约束、唯一性约束等。

隔离性(Isolation)

        隔离性是指多个事务并发执行时,彼此之间是相互隔离的,一个事务的执行不应该受到其他事务的干扰。即使多个事务同时访问同一个数据,也不能相互影响,每个事务感觉自己独立地操作数据。为了保证隔离性,数据库系统采用了多种隔离级别,如下文所述。

持久性(Durability)

        持久性是指事务一旦提交成功,对数据库的修改就是永久性的,不会因为数据库崩溃或其他原因导致数据丢失。即使系统发生故障,也能够保证数据不会丢失。

隔离级别

        隔离级别是指多个事务并发执行时,一个事务对数据的修改对其他事务的可见程度。常见的隔离级别有四种,分别是读未提交(Read uncommitted)、读已提交(Read committed)、可重复读(Repeatable read)和串行化(Serializable)。

读未提交(Read uncommitted)

        读未提交是最低的隔离级别,一个事务可以读取其他事务未提交的数据,可能会导致脏读(Dirty read)问题,即读到了其他事务已经修改但未提交的数据。

读已提交(Read committed)

        读已提交是指一个事务只能读取已经提交的其他事务的数据,可以避免脏读问题。但是由于其他事务正在执行,所以可能出现不可重复读(Non-repeatable read)问题,即同一个事务内读取同一数据两次,结果不一致。

可重复读(Repeatable read)

        可重复读是指同一个事务内多次读取同一数据时,结果是一致的,即使其他事务修改了该数据,也不会对该事务造成影响。可重复读可以避免不可重复读问题,但是可能会出现幻读(Phantom read)问题,即同一个事务内两次查询,结果不一致,因为其他事务在此期间插入了符合条件的数据。

串行化(Serializable)

        串行化是最高的隔离级别,强制所有事务串行执行,避免了脏读、不可重复读和幻读等问题。但是由于强制串行执行,导致并发性能非常差,一般不推荐使用。

为什么要使用事务

        使用事务的主要目的是保证数据库中的数据一致性和完整性。在现实生活中,许多业务场景都需要保证多个操作作为一个整体进行,而不是单独执行,这时候就需要使用事务来保证这些操作的原子性,也就是要么全部执行成功,要么全部失败,保证数据的一致性。

举个例子,假设我们要从银行账户A向账户B转账100元。这个过程需要进行两个操作:将账户A的余额减去100元,将账户B的余额增加100元。如果没有事务保证,当这两个操作分别执行时,如果在这两个操作之间发生了系统崩溃、网络中断等异常情况,就有可能导致A账户扣款成功但B账户未收到款项,从而导致数据的不一致性。使用事务可以保证这两个操作作为一个整体进行,如果在操作过程中出现异常,可以回滚事务,保证数据的完整性。

此外,使用事务还可以避免多个客户端并发修改同一个数据造成的数据冲突问题,比如脏读、不可重复读、幻读等。通过设置不同的隔离级别,可以平衡并发性能和数据一致性之间的关系。

因此,使用事务可以有效保证数据库中数据的一致性和完整性,同时避免多个客户端并发修改同一个数据造成的数据冲突问题。

案例演示:

        展示如何使用事务来保证一组 SQL 操作的原子性。

        假设我们有两个表,一个是用户表 user,一个是订单表 order,其中订单表记录了每个用户的订单信息。现在我们要实现一个功能,当用户下单时,需要先将用户的余额扣减相应的金额,然后再在订单表中插入一条订单记录。

首先,我们创建表:

CREATE TABLE user (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,balance DECIMAL(10, 2) NOT NULL DEFAULT 0.00
);CREATE TABLE order (id INT PRIMARY KEY AUTO_INCREMENT,user_id INT NOT NULL,amount DECIMAL(10, 2) NOT NULL,created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

接下来,我们可以使用以下的 SQL 语句来实现这个功能:

START TRANSACTION; -- 开始事务UPDATE user SET balance = balance - 100.00 WHERE id = 1; -- 扣减用户余额INSERT INTO order (user_id, amount) VALUES (1, 100.00); -- 插入订单记录COMMIT; -- 提交事务

        在上面的代码中,我们首先使用 START TRANSACTION 开始一个事务,然后执行扣减用户余额的操作和插入订单记录的操作,最后使用 COMMIT 提交事务。如果在执行这些操作的过程中发生了任何错误,我们可以使用 ROLLBACK 回滚事务,保证数据的完整性和一致性。

        需要注意的是,如果使用 InnoDB 引擎,MySQL 默认的隔离级别是 REPEATABLE READ。这种隔离级别可以避免脏读、不可重复读、幻读等问题,但是也可能导致性能问题。如果需要平衡并发性能和数据一致性,可以考虑使用更低的隔离级别,比如 READ COMMITTEDREAD UNCOMMITTED

相关文章:

数据库事务

什么是事务 在数据库中,事务(Transaction)是指一组数据库操作,这些操作要么全部成功执行,要么全部失败回滚,是保证数据库操作一致性的基本单位。事务具有原子性(Atomicity)、一致性…...

Macbook(苹果电脑) VSCode 创建简单c++程序 配置C++开发环境

1.打开 Terminal 终端(Command空格,输入Terminal)。 1.1 输入如下指令,查看是否显示版本信息。 clang --version 1.2 如果出现版本信息,则跳过,否则输入 xcode-select --install 2. 为 VS Code 安装插件 …...

如何使用 Matlab 构建深度学习模型

深度学习已经成为了AI领域的热门话题,相信很多人都想学习如何构建深度学习模型,那么,我们就一起来看看如何使用Matlab构建深度学习模型。 首先,我们需要准备好Matlab的环境。Matlab是一款非常强大的数学计算软件,它提…...

PDF怎么转CAD文件?(免费!高效转换方法汇总)

一般而言,PDF图纸是不能修改的。若需修改,则需将PDF转CAD,此时如何满足PDF转CAD的需求呢?今天,我将教你两种免费的PDF转CAD的方法,助力高效办公。 1.本地软件转换法 这是用本地软件转换方法,支…...

经历了野蛮生长之后,新科技或许已经抵达了全新的临界点

跳出仅仅只是以概念和营销的方式来定义元宇宙,真正找到元宇宙与现实商业之间的桥接,让元宇宙可以在真实实践上得到复现,才是保证元宇宙的发展可以进入到一个全新发展阶段的关键所在。归根到底,我们还是要找到元宇宙落地的正确的方…...

Segment Anything论文翻译,SAM模型,SAM论文,SAM论文翻译;一个用于图像分割的新任务、模型和数据集;SA-1B数据集

【论文翻译】- Segment Anything / Model / SAM论文 论文链接: https://arxiv.org/pdf/2304.02643.pdfhttps://ai.facebook.com/research/publications/segment-anything/ 代码连接:https://github.com/facebookresearch/segment-anything 论文翻译&…...

EMQX vs NanoMQ | 2023 MQTT Broker 对比

引言 EMQX 和 NanoMQ 都是由全球领先的开源物联网数据基础设施软件供应商 EMQ 开发的开源 MQTT Broker。 EMQX 是一个高度可扩展的大规模分布式 MQTT Broker,能够将百万级的物联网设备连接到云端。NanoMQ 则是专为物联网边缘场景设计的轻量级 Broker。 本文中我们…...

RabbitMQ实现消息的延迟推送或延迟发送

一、RabbitMQ是什么? 1.RabbitMQ简介 RabbitMQ是有erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列。 常见的消息队列有:RabbitMQ、Kafka 和 ActiveMQ 2.RabbitMQ的优点 Rab…...

解决python中import导入自己的包呈现灰色 无效的问题

打开File–> Setting—> 打开 Console下的Python Console,把选项(Add source roots to PYTHONPAT)点击勾选上。 右键点击需要导入的工作空间文件夹,找到Mark Directory as 选择Source Root。 另外,Python中的…...

消息中间件对比

1,常见消息中间件对比(后续逐个介绍) 比较项TubeMQKafkaPulsar数据时延非常低,10ms比较低,250ms非常低,10msTPS高,14W/s一般,10W/s高,14W/s (高性能场景)过滤消费支持服务端过滤和客户端过滤客…...

nodejs+vue 高校校园食堂餐品在线订购网

食堂作为学校的一个重要的部门,为学生提供了用餐的地点,学生可以在食堂享用丰富的餐品,建立一个在校订餐网站,帮助了学生提供一个用餐订餐的系统,也帮助了食堂提供了一个餐品展示的站点。 园的食堂作为一个窗口单位&a…...

SpringBoot【运维实用篇】---- SpringBoot程序的打包与运行

SpringBoot【运维实用篇】---- SpringBoot程序的打包与运行 程序打包程序运行SpringBoot程序打包失败处理命令行启动常见问题及解决方案 刚开始做开发学习的小伙伴可能在有一个知识上面有错误的认知,我们天天写程序是在Idea下写的,运行也是在Idea下运行的…...

10万字智慧政务数据中心平台建设方案

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除。 一、 项目建设内容 1. 基础支撑平台 基础支撑平台是云教育公共服务平台各子系统的公共运行环境,提供底层数据交换、集成服务以及统一身份认证和基础数据同步服…...

使用 TensorFlow 构建机器学习项目:1~5

原文:Building Machine Learning Projects with TensorFlow 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象&#x…...

【store商城项目08】删除用户的收获地址

1.删除收获地址-持久层 1.1规划SQL语句 根据aid判断数据是否存在,根据返回的uid判断数据是否对应(已开发)根据aid删除的SQL delete from t_address where aid ?根据1中的SQL返回的对象判断是否为默认地址,若为默认地址&#…...

SpringBooot

目录 一、简介 1、使用原因 2、JavaConfig (1)Configuration注解 (2)Bean注解 (3)ImportResource注解 (4)PropertyResource注解 (5)案例 3、简介 4…...

测牛学堂:2023软件测试linux和shell脚本入门系列(shell的运算符)

shell中的注释 以# 开头的就是shell中的注释,不会被执行,是给编程的人看的。 shell中的运算符 shell中有很多运算符。 按照分类,可以分为算术运算符,关系运算符,布尔运算符,字符串运算符,文件…...

TensorFlow 2.0 快速入门指南:第三部分

原文:TensorFlow 2.0 Quick Start Guide 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,只关心如何实现…...

webpack介绍

webpack是一个静态资源打包工具 开发时,我们会使用框架(Vue,React),ES6模块化语法,Less/Sass等css预处理器等语法进行开发。 这样的代码想要在浏览器运行必须经过编译成浏览器能识别的JS、CSS等语法&#x…...

SpringBoot 面试题汇总

1、spring-boot-starter-parent 有什么用 ? 我们都知道,新创建一个 SpringBoot 项目,默认都是有 parent 的,这个 parent 就是 spring-boot-starter-parent ,spring-boot-starter-parent 主要有如下作用: 1、 定义了 J…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"&#xff0…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

2023赣州旅游投资集团

单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...