【Java 进阶篇】MySQL 事务详解

在数据库管理中,事务是一组SQL语句的执行单元,它们被视为一个整体。事务的主要目标是保持数据库的一致性和完整性,即要么所有SQL语句都成功执行,要么所有SQL语句都不执行。在MySQL中,事务起到了非常重要的作用,特别是在需要确保数据的完整性和一致性的应用程序中。
本文将详细介绍MySQL事务的概念、特性、隔离级别、事务的控制和示例代码等内容,以帮助您更好地理解和应用MySQL事务。
1. 什么是事务?
事务是一组SQL语句的有序执行集合,被视为一个不可分割的工作单元。它要么全部执行成功,要么全部失败回滚,保持数据库的一致性和完整性。事务是一种用于处理多个数据库操作的机制,常常应用于以下场景:
-
银行转账:如果从一个账户扣除金额并将其存入另一个账户,必须确保两个操作都成功或都失败,以防止资金丢失。
-
订单处理:在创建订单时,必须同时减少库存并增加销售记录,以保持库存和销售数据的一致性。
-
预订系统:在预订机票或酒店时,需要同时锁定座位或房间并减少可用数量,以避免重复预订。
2. 事务的特性(ACID)
事务必须具备以下四个特性,通常称为ACID属性:
2.1 原子性(Atomicity)
原子性指事务是不可分割的工作单元,要么全部执行成功,要么全部失败回滚。如果一个事务包含多个操作,其中任何一个操作失败,整个事务都应该被回滚,以保持数据库的一致性。
2.2 一致性(Consistency)
一致性确保在事务开始和结束时数据库的完整性不被破坏。事务执行后,数据库应该处于一种一致的状态,即满足所有约束和规则。
2.3 隔离性(Isolation)
隔离性指多个事务并发执行时,每个事务都应该感觉自己在独立地操作数据库,即一个事务的执行不应该影响其他事务的执行。MySQL提供了多个隔离级别,用于控制事务之间的可见性。
2.4 持久性(Durability)
持久性确保一旦事务提交,其结果将永久保存在数据库中,即使发生系统故障也不会丢失。
3. 事务的隔离级别
MySQL支持多个事务隔离级别,以控制不同事务之间的可见性。隔离级别从低到高分别为:
3.1 读未提交(Read Uncommitted)
在这个级别下,事务可以读取其他事务尚未提交的数据。这是最低的隔离级别,不提供任何隔离性。
3.2 读已提交(Read Committed)
在这个级别下,事务只能读取已提交的数据。其他事务正在执行的数据对当前事务是不可见的。这是MySQL默认的隔离级别。
3.3 可重复读(Repeatable Read)
在这个级别下,事务可以读取其他事务已提交的数据,但其他事务正在执行的数据对当前事务是不可见的。这个级别保证了事务在执行期间看到的数据保持一致,不会发生读取到脏数据或不可重复读的情况。但是,它仍然允许出现幻读的情况。
3.4 串行化(Serializable)
在这个级别下,事务是串行执行的,不允许并发执行。这提供了最高级别的隔离性,但可能会降低性能。
4. 事务的控制
在MySQL中,您可以使用以下SQL语句来控制事务的开始、提交和回滚:
4.1 开始事务
要开始一个事务,使用START TRANSACTION或BEGIN语句:
START TRANSACTION; -- 或者使用 BEGIN;
4.2 提交事务
要提交一个事务,使用COMMIT语句:
COMMIT;
提交事务将使所有更改永久保存到数据库。
4.3 回滚事务
要回滚一个事务,使用ROLLBACK语句:
ROLLBACK;
回滚事务将撤销所有未提交的更改。
5. 事务的示例
下面是一个简单的示例,演示如何在MySQL中执行事务。
假设有一个银行数据库,包含了两个表:accounts用于存储账户信息,transactions用于存储交易记录。我们想要执行一个事务,从一个账户扣除金额并将其存入另一个账户。
-- 开始事务
START TRANSACTION;-- 扣除金额
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;-- 增加金额
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;-- 提交事务
COMMIT;
在上面的示例中,事务首先开始,然后执行两个UPDATE语句,一个是扣除金额,另一个是增加金额,最后通过COMMIT语句提交事务。
如果在执行这个事务期间发生了错误,可以使用ROLLBACK语句来回滚事务,以确保不会影响数据库的一致性和完整性。
6. 总结
事务是数据库管理中的重要概念,用于确保数据的一致性和完整性。MySQL提供了不同的事务隔离级别,以满足不同应用程序的需求。通过控制事务的开始、提交和回滚,可以有效地管理数据库操作。理解和使用事务是编写可靠和高性能的数据库应用程序的关键一步。希望本文能帮助您更好地理解MySQL事务的概念和使用。
| 作者信息 作者 : 繁依Fanyi CSDN: https://techfanyi.blog.csdn.net 掘金:https://juejin.cn/user/4154386571867191 |
相关文章:
【Java 进阶篇】MySQL 事务详解
在数据库管理中,事务是一组SQL语句的执行单元,它们被视为一个整体。事务的主要目标是保持数据库的一致性和完整性,即要么所有SQL语句都成功执行,要么所有SQL语句都不执行。在MySQL中,事务起到了非常重要的作用…...
Spring修炼之旅(3)自动装配与注解开发
一、自动装配说明 1.1概述 自动装配是使用spring满足bean依赖的一种方法 spring会在应用上下文中为某个bean寻找其依赖的bean。 1.2装配机制 Spring中bean有三种装配机制,分别是: 在xml中显式配置; 在java中显式配置; 隐式…...
嵌入式Linux应用开发-基础知识-第十六章GPIO和Pinctrl子系统的使用
嵌入式Linux应用开发-基础知识-第十六章GPIO和Pinctrl子系统的使用 第十六章 GPIO 和 Pinctrl 子系统的使用16.1 Pinctrl 子系统重要概念16.1.1 引入16.1.2 重要概念16.1.3 示例16.1.4 代码中怎么引用pinctrl 16.2 GPIO子系统重要概念16.2.1 引入16.2.2 在设备树中指定引脚16.2…...
Ubuntu系统下使用apt-get安装Mysql8
记录一下在Ubuntu20.04 64位系统下面使用apt-get方式安装mysql8关系型数据库 Centos下使用yum安装Mysql8(Mysql5.7)以及常见的配置和使用 首先肯定是检查下当前Ubuntu系统是否已经安装过mysql数据库 一般拿到新的云服务器是没有安装的 rootmyw:~# whe…...
jenkins联动显示或隐藏参数
1. 添加组件 Active Choices Plug-in 如jenkins无法联网,可在以下两个地址中下载插件,然后放到/home/jenkins/.jenkins/plugin下面重启jenkins即可 Active Choices Active Choices | Jenkins plugin 2. 效果如下: sharding为空时…...
Error: Activity class {xxx.java} does not exist
git切换到不同的branch之后,报下面的错误: Error: Activity class {xxx.java} does not exist 解决方案: 首先clean 然后会删除build目录 然后点击:Invalidate Caches Android Studio重启,然后重新build即可。...
保护模式阶段测试-模拟3环0环调用
保护模式阶段测试-模拟3环0环调用 最近又复习了一下保护模式相关的内容,然后打算搞个能够把段页的大部分知识能够串联起来的测试代码 最终想到的一个项目如下: 三环部分: 0.编写一个函数读取高2g的地址内容 1.通过设备通信到0环告诉0环我新…...
Dart笔记:stream_channel 包用法
标题1 标题2 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/133426961 【介绍】stream_channel是一个用…...
Java进阶必会JVM-深入浅出Java虚拟机
系列文章目录 送书第一期 《用户画像:平台构建与业务实践》 送书活动之抽奖工具的打造 《获取博客评论用户抽取幸运中奖者》 送书第二期 《Spring Cloud Alibaba核心技术与实战案例》 送书第三期 《深入浅出Java虚拟机》 文章目录 系列文章目录前言一、推荐书籍二…...
1200*B. Sorted Adjacent Differences(构造)
Problem - 1339B - Codeforces 解析: 题目要求每相邻两个值差的绝对值相等或递增。 先排序,可以想到我们先取两侧的数肯定相距最远,然后靠中心每次取两个数,这样符合题目要求。 直接遍历,先取的是答案靠后的数据&…...
恼人的TCP套接字部分发送成功场景
源起 以前就知道套接字有可能出现部分发送成功的可能,直到近段时间一个典型的使用场景触发了明确的此问题,才予以重视,比较深入地考虑解决这个问题的方案! 分析 因为TCP的流式特征,如果出现部分发送成功,…...
ROS2 中的轻量级、自动化、受控回放
一、说明 这篇文章描述了一种在 ROS2 中实现受控重播器的轻量级方法。用以测试中将现象重新播放一遍,以实现调参或故障定位的目的。所有源代码都可以在这里找到。该帖子也可在此处获得。 二、问题:不同步重播 任何曾经认真开发过 ROS2 的人都会知道这个问…...
Egg使用jwt拦截jtoken验证
安装 npm install egg-jwt注册插件 在config文件夹子下 plugin,js下 use strict;module.exports {//mysqlmysql: {enable: true,package: egg-mysql},//jwtjwt: {enable: true,package: egg-jwt} };使用中间件 在app文件下创建 middleware 文件夹 在middleware 文件下创建…...
装饰器模式详解和实现(设计模式 二)
装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地将对象添加到现有对象中,以提供额外的功能,同时又不影响其他对象。 实现示例 1.定义一个接口或抽象类,表示被装饰对象的公共接口 //抽…...
面试问到MySQL模块划分与架构体系怎么办
面试问到Mysql模块划分与架构体系怎么办 文章目录 1. 应用层连接管理器(Connection Manager)安全性和权限模块(Security and Privilege Module) 2. MySQL服务器层2.1. 服务支持和工具集2.2. SQL Interface2.3. 解析器举个解析器 …...
并查集及其优化
1.并查集 #define SIZE 100 int UFSets[SIZE];void Initial(int S[]) {for (int i 0; i < SIZE; i)S[i]-1; }int Find(int S[], int x) {//查while(S[x] > 0)x S[x];return x; }void Union(int S[], int Root1, int Root2) {//并if(Root1 Root2)return;S[Root2] Roo…...
LeetCode 周赛上分之旅 #48 一道简单的树上动态规划问题
⭐️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度…...
mysql报错:Column Count Doesn‘t Match Value Count at Row 1
mysql中执行insert、update、delete报错:Column Count Doesnt Match Value Count at Row 1 的解决方案 通常情况:字段不匹配 如:student有id, name, age字段 -- 错误写法 INSERT INTO student VALUES(5,horse)-- 正确写法 INSERT INTO stu…...
安卓 kuaishou 设备did和egid 学习分析
did和egid注册 接口 https://gdfp.ksapisrv.com/rest/infra/gdfp/report/kuaishou/android did 是本地生成的16进制 或者 获取的 android_id public static final Random f16237a new Random(System.currentTimeMillis()); public static long m19668a() { return f1623…...
基于Vue+ELement实现增删改查案例与表单验证(附源码)
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《ELement》。🎯🎯 …...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
