深入解析 MySQL 事务:从基础概念到高级应用

深入解析 MySQL 事务:从基础概念到高级应用

一、定义

事务是由一个或多个 SQL 语句组成的独立工作单元,在这个单元中,每个 SQL 语句都是相互依赖的。事务作为一个不可分割的整体存在,要么全部成功,要么全部失败,不可能存在部分成功、部分失败的情况。

简而言之,事务就是一个整体,内部的 SQL 语句要么全部执行成功,要么全部执行失败。一旦某条 SQL 语句执行失败或出错,整个事务将回滚(返回最初状态),所有受到影响的数据将恢复到事务开始前的状态;若所有 SQL 语句执行成功,则事务顺利提交。

在 MySQL 中,数据存储由不同的存储引擎管理,不同存储引擎有各自特点。常见存储引擎有 InnoDB、MyISAM 和 Memory 等。其中,InnoDB 支持事务(transaction),而 MyISAM 和 Memory 等不支持事务。

可以通过 SHOW ENGINES; 语句查看 MySQL 支持的存储引擎。

二、特性(ACID)

事务具有四个关键特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),简称 ACID。

  • 原子性(Atomicity):事务是一个不可分割的最小工作单位,事务中的操作要么全部发生,要么全部不发生。
  • 一致性(Consistency):事务必须使数据库从一个一致状态变换到另一个一致状态。例如,李二给王五转账 50 元,要么李二账户减 50 元、王五账户加 50 元,要么都不发生。
  • 隔离性(Isolation):一个事务的执行不能被其他事务干扰,事务内部的操作及使用的数据对并发的其他事务是隔离的。
  • 持久性(Durability):事务一旦提交成功,它对数据库的改变将是永久性的,后续的操作或故障不会影响其结果。

三、分类

事务分为隐式事务和显式事务。DML 语句(INSERT、UPDATE、DELETE)是隐式事务。

隐式事务

没有明显的开启和结束标记,自动提交事务。比如,UPDATE 语句修改数据,相当于一个隐式事务。

举例:张三同学购买一个 CSDN 定制保温杯花 99 元,这相当于一个 UPDATE 语句,减去张三余额中的 99 元:

UPDATE accounts SET balance = balance - 99 WHERE name = '张三';

显式事务

具有明显的开启和结束标记。使用显式事务的前提是禁用自动提交功能(将 autocommit 设置为 0)。

查看当前 autocommit 状态:

SHOW VARIABLES LIKE 'autocommit';

禁用自动提交:

SET autocommit = 0;

四、开启事务

显式事务需要手动开启和提交或回滚。以下是一个使用显式事务的示例:

-- 步骤一:开启事务
START TRANSACTION;-- 步骤二:编写事务中的 SQL 语句(INSERT、UPDATE、DELETE)
-- 例如,实现“李二给王五转账”的事务过程
UPDATE t_account SET balance = balance - 50 WHERE vname = '李二';
UPDATE t_account SET balance = balance + 50 WHERE vname = '王五';-- 步骤三:结束事务
COMMIT; -- 提交事务
-- ROLLBACK; -- 回滚事务:即事务不执行,恢复到事务执行前的状态

五、并发问题

多个事务并发运行时,如果没有适当的隔离机制,就会发生以下问题:

  • 脏读(Dirty Read):事务 T1 读取了事务 T2 更新但未提交的数据,如果 T2 回滚,T1 读取的数据是无效的。
  • 不可重复读(Non-repeatable Read):事务 T1 读取某字段后,事务 T2 更新了该字段,T1 再次读取时,值不同。
  • 幻读(Phantom Read):事务 T1 读取某表的数据后,事务 T2 向该表插入新数据,T1 再次读取时,发现多了几行数据。

为了避免这些并发问题,MySQL 提供了四种事务隔离级别:

六、隔离级别

MySQL 提供四种事务隔离级别,不同隔离级别对应不同的并发控制程度和性能影响:

  • 读未提交(Read Uncommitted):允许读取未提交的变更,可能出现脏读、不可重复读和幻读。适用于对数据一致性要求低的场景。
  • 读已提交(Read Committed):只能读取已提交的变更,可以避免脏读,但仍可能出现不可重复读和幻读。适用于对数据一致性要求较高,但允许部分并发的场景。
  • 可重复读(Repeatable Read):确保多次读取同一字段的值一致,可以避免脏读和不可重复读,但仍可能出现幻读。MySQL 的默认隔离级别。
  • 串行化(Serializable):完全锁定事务执行期间的数据,避免所有并发问题,但性能较低。适用于对数据一致性要求极高,且允许性能降低的场景。

Oracle 支持两种事务隔离级别:Read Committed 和 Serializable。
Oracle 默认事务隔离级别是:Read Committed。
MySQL 默认事务隔离级别是:Repeatable Read。

事务隔离级别越高,数据一致性越好,但并发性能越差。开发者需要根据具体业务需求选择合适的隔离级别,以在性能和数据一致性之间取得平衡。

七、示例

假设我们有一个简单的银行账户转账系统,包含两个账户表(t_account)。我们希望在两个账户之间进行转账操作时,保证事务的一致性。

1. 创建数据库和表

CREATE DATABASE bank;
USE bank;CREATE TABLE t_account (id INT AUTO_INCREMENT PRIMARY KEY,vname VARCHAR(50) NOT NULL,balance DECIMAL(10, 2) NOT NULL
);INSERT INTO t_account (vname, balance) VALUES ('李二', 100.00), ('王五', 100.00);

2. 实现转账操作

-- 开启事务
START TRANSACTION;-- 从李二账户扣除 50 元
UPDATE t_account SET balance = balance - 50 WHERE vname = '李二';-- 向王五账户增加 50 元
UPDATE t_account SET balance = balance + 50 WHERE vname = '王五';-- 提交事务
COMMIT;-- 检查结果
SELECT * FROM t_account;

在实际应用中,开发者可以通过编程语言(如 Java、Python)结合数据库驱动(如 JDBC、SQLAlchemy)来管理事务。例如,在 Java 中,可以使用 JDBC 的 Connection 对象的事务管理方法:

try (Connection conn = dataSource.getConnection()) {conn.setAutoCommit(false);try (PreparedStatement stmt1 = conn.prepareStatement("UPDATE t_account SET balance = balance - ? WHERE vname = ?")) {stmt1.setBigDecimal(1, new BigDecimal("50.00"));stmt1.setString(2, "李二");stmt1.executeUpdate();}try (PreparedStatement stmt2 = conn.prepareStatement("UPDATE t_account SET balance = balance + ? WHERE vname = ?")) {stmt2.setBigDecimal(1, new BigDecimal("50.00"));stmt2.setString(2, "王五");stmt2.executeUpdate();}conn.commit();
} catch (SQLException e) {conn.rollback();throw e;
}

通过这种方式,可以在应用程序层面确保事务的原子性、一致性、隔离性和持久性(ACID)。

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

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

相关文章

APP安全测试总结-看这篇就够了

APP安全测试项总结如下: 一、静态分析 代码审查:检查代码是否存在安全漏洞,如硬编码密码、敏感信息明文存储等。配置文件分析:分析APP的配置文件,查看是否存在不当的权限设置等。反编译测试:使用反编译工…

【我是产品经理_注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞 …

go匿名函数

【1】Go支持匿名函数,如果我们某个函数只是希望使用一次,可以考虑使用匿名函数 【2】匿名函数使用方式: (1)在定义匿名函数时就直接调用,这种方式匿名函数只能调用一次(用的多) &am…

【推荐系统简介以及其链路流程】

文章目录 1、数据收集和预处理1.1、推荐系统的数据架构 2、用户(user)画像和物品(item)画像的构建3、特征工程3.1、特征提取的框架3.1.1、物料画像3.1.2、用户画像3.1.3、交叉特征3.1.4、偏差特征 3.2、数值特征的处理3.2.1、缺失…

数据更新-插入元组(VALUES)、修改属性(SET)、删除元组(DELETE)

一、插入元组 1、插入单个元组&#xff08;使用的是VALUES子句&#xff09; &#xff08;1&#xff09;语句格式 INSERT INTO <表名> 【&#xff08;<属性名1【&#xff0c;<属性名2>&#xff0c;...】&#xff09;】 VALUES &#xff08;<常量1>【&a…

RGB摄像头设置图像格式(YUV/MJPEG)不生效问题

linux平台摄像RGB摄像头图像格式不生效问题记录。 有问题的代码流程&#xff1a; 1.rgb_init打开摄像头 2.start设置rgb图像格式然后取流 3.stop停止取流 4.rgb_deinit关闭摄像头 使用流程&#xff1a; 设置MJPEG格式&#xff0c;开始取流&#xff0c;停止取流&#xff0…

后端项目实战--瑞吉外卖项目软件说明书

瑞吉外卖项目软件说明书 一、项目概述 瑞吉外卖项目是一个外卖服务平台&#xff0c;用户可以通过该平台浏览餐厅菜单、下单、支付以及追踪订单状态。产品原型就是一款产品成型之前的一个简单的框架&#xff0c;就是将页面的排版布局展现出来&#xff0c;使产品得初步构思有一…

有哪些常用ORM框架

ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;是一种编程技术&#xff0c;它允许开发者使用面向对象的编程语言来操作关系型数据库。ORM的主要目的是将数据库中的数据表映射到编程语言中的对象&#xff0c;从而使得开发者可以使用对象的方式来…

如何加速海外网络?提升海外应用访问速度的策略

随着全球化的迅猛发展&#xff0c;越来越多的国内企业需要与海外合作伙伴进行业务往来和数据交流。然而&#xff0c;许多企业在访问国外网站和应用时常常面临卡顿和延迟的问题&#xff0c;这不仅降低了工作效率&#xff0c;还可能错失商机。那么&#xff0c;企业如何在访问海外…

Android面试题之ActivityManagerService的启动流程

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 SystemServer启动 创建SystemContex 用于加载系统相关的资源&#xff0c;比如theme&#xff0c;android命名空间下的资源等创建引导服务&#…

mysql和postgreSQL的区别

mysql 1、mysql多表连接查询方式支支持nest loop&#xff0c;不支持hash join和sort merge join。pg支持多种连接查询方式。 2、mysql子查询性能比pg低。 3、mysql的复制是异步的&#xff0c;即无法通过主从架构做到数据零丢失。一些第三方公司也有改造mysql源代码实现同步复制…

【堆】Leetcode 373. 查找和最小的 K 对数字【中等】

查找和最小的 K 对数字 给定两个以 非递减顺序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。 定义一对值 (u,v)&#xff0c;其中第一个元素来自 nums1&#xff0c;第二个元素来自 nums2 。 请找到和最小的 k 个数对 (u1,v1), (u2,v2) … (uk,vk) 。 示例 1: 输入: …

C++中的中介者模式

目录 中介者模式&#xff08;Mediator Pattern&#xff09; 实际应用 聊天室 空中交通管制系统 智能家居控制系统 总结 中介者模式&#xff08;Mediator Pattern&#xff09; 中介者模式是一种行为型设计模式&#xff0c;它定义了一个对象来封装一系列对象之间的交互。通…

02 Pytorch_NLP

1. N-gram n决定关联信息 2. TF____IDF TF&#xff1a;词频 IDF&#xff1a;逆向序列 假如&#xff1a;TF * IDF 就是当前的文件&#xff0c;那么乘积反而更大&#xff01; 因为它只出现在 特定的文章中&#xff01; TF-IDF 简介 TF-IDF&#xff08;Term Frequency-Inverse…

css入门基础

目录 1. CSS前景 2.什么是CSS 3.CSS发展史 4.CSS的3种样式格式 5.CSS 的语法 6.CSS的字体样式 7.选择器类型 8.CSS外观属性 1. CSS前景 从HTML被发明开始&#xff0c;样式就以各种形式存在。不同的浏览器结合它们各自的样式语言为用户提供页面效果的控制。最初的HTML只…

专业学习|博弈论-博弈论概述

&#xff08;一&#xff09;认识博弈论&#xff1a;解析复杂决策与策略 &#xff08;1&#xff09;认识博弈 博弈论广泛应用于分析个体间因利益冲突而产生的决策问题。通过构建不同模型来探讨如经贸关系、军事威胁等问题&#xff0c;旨在寻找均衡解并提供新知&#xff0c;相较…

mathematical-expression-cpp | C++ 数学表达式解析库

数学表达式-cpp Switch to English Document 介绍 本框架是一种针对数学公式解析的有效工具&#xff0c;能够通过C的API解析包含嵌套函数&#xff0c;包含函数&#xff0c;数列步长累加等数学公式&#xff0c;返回值是一个数值的结果对象&#xff0c;同时也可以进行比较运算…

idea在空工程中添加新模块并测试的步骤

ServicesTest是空的工程&#xff0c;没有pom文件。现在需要在ServicesTest目录下添加新模块作为新的工程&#xff0c;目的是写一下别的技术功能。 原先目录结构&#xff0c;ServicesTest是空的工程&#xff0c;没有pom文件。下面的几个模块是新的工程&#xff0c;相互独立。 1.…

LLM大模型的挑战与未来,挑战大但是机遇更大!

大模型必然是未来很长一段时间我们工作生活的一部分&#xff0c;而对于这样一个与我们生活高度同频互动的“大家伙”&#xff0c;除了性能、效率、成本等问题外&#xff0c;大规模语言模型的安全问题几乎是大模型所面对的所有挑战之中的重中之重&#xff0c;机器幻觉是大模型目…