【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》。🎯🎯 …...
Kindle漫画转换终极方案:如何解决电子阅读器上的格式兼容性问题
Kindle漫画转换终极方案:如何解决电子阅读器上的格式兼容性问题 【免费下载链接】kcc KCC (a.k.a. Kindle Comic Converter) is a comic and manga converter for ebook readers. 项目地址: https://gitcode.com/gh_mirrors/kc/kcc 你是否曾经尝试在Kindle上…...
实战指南:基于快马平台,快速构建可部署的unet卫星图像分割系统
今天想和大家分享一个实战项目:基于UNet的卫星图像建筑物分割系统。这个项目特别适合在InsCode(快马)平台上快速搭建,因为它涉及从数据处理到模型部署的完整流程,而平台的一键部署功能正好能省去繁琐的环境配置工作。 项目背景与需求分析 卫星…...
如何用网盘直链下载助手突破限制提升效率:5个实用技巧
如何用网盘直链下载助手突破限制提升效率:5个实用技巧 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…...
保姆级教程:在Windows系统本地部署Qwen3-14B-Int4-AWQ对话模型
保姆级教程:在Windows系统本地部署Qwen3-14B-Int4-AWQ对话模型 1. 前言:为什么选择本地部署? 在个人电脑上运行大语言模型听起来可能有些遥不可及,但随着模型量化技术的进步,现在即使是消费级显卡也能流畅运行14B参数…...
电话号码定位开源工具实战完全指南:从部署到企业应用
电话号码定位开源工具实战完全指南:从部署到企业应用 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/gh_mirro…...
UDS诊断服务-10例程控制服务(0x31)实战:从协议解析到车辆传感器校准
1. 从车辆抖动问题认识0x31服务的重要性 去年夏天,我遇到一辆行驶里程8万公里的SUV,车主反映急加速时发动机抖动明显。用诊断仪读取故障码显示"P0172 - 燃油修正系统过浓",但更换氧传感器和火花塞后问题依旧。这时候就需要请出我们…...
Pixel Couplet Gen部署案例:混合云架构(公有云API+私有云模型)方案
Pixel Couplet Gen部署案例:混合云架构(公有云API私有云模型)方案 1. 项目背景与价值 Pixel Couplet Gen是一款融合传统春节文化与现代像素艺术风格的AI春联生成器。该项目基于ModelScope大模型驱动,通过创新的8-bit像素游戏UI设…...
LeetCode 热题 100 之 131. 分割回文串 51. N 皇后
131. 分割回文串 51. N 皇后 131. 分割回文串 class Solution {public List<List<String>> partition(String s) {List<List<String>> res new ArrayList<>();List<String> path new ArrayList<>();backtrack(s, 0, path, res);re…...
uniapp 雪花算法封装类
1. uniapp 雪花算法封装类 雪花算法(SnowFlake)生成64位整数ID,具有全局唯一、趋势递增、高性能等特点,适合分布式系统。 1.1. 解决分布式全局唯一ID的方法 1.1.1. UUID UUID做全局ID的弊端:UUID是由数字加字母的形式组成,无法保持递增,它使得聚簇索引(主键值和行数据…...
Psins实战:从零解析SINS/GPS松组合导航中的Kalman滤波器初始化与调参
1. 初识SINS/GPS松组合导航与Kalman滤波 刚接触导航算法的朋友可能会被"SINS/GPS松组合"这个术语吓到,其实拆开看很简单。SINS(捷联惯性导航系统)就像是个不知疲倦的计步器,通过IMU(惯性测量单元)…...
