深入解析 SQL 事务:确保数据一致性的关键

SQL 事务

  • 什么是 SQL 事务?
  • 事务的 ACID 特性
    • 原子性(Atomicity):
      • 示例:
    • 一致性(Consistency):
      • 示例:
    • 隔离性(Isolation):
    • 持久性(Durability):
      • 示例:
  • 如何管理 SQL 事务?
    • 开始事务(BEGIN TRANSACTION)
    • 提交事务(COMMIT)
    • 回滚事务(ROLLBACK)
    • 保存点(SAVEPOINT)
  • MySQL 事务管理
  • MyBatis 事务管理

在现代数据库管理系统中,事务(Transaction)是保证数据完整性和一致性的核心机制。事务在处理多个数据库操作时,提供了强有力的支持,确保这些操作要么全部成功,要么全部失败,从而避免了不一致的数据状态。在本文中,我们将深入探讨SQL事务的定义、特性、使用方式以及实际应用,帮助你全面理解事务的工作原理和最佳实践。

什么是 SQL 事务?

SQL 事务是一组操作的集合,它们要么全部执行,要么全部不执行。事务的基本目的是保证在执行多个操作时,数据库的数据状态保持一致,不会被部分执行的操作所破坏。事务的执行是原子的,这意味着所有操作在成功提交时是不可分割的。如果其中某个操作失败,事务会回滚,所有已经执行的操作都会被撤销。

SQL 事务有助于在数据库操作过程中管理复杂的数据一致性问题,尤其在高并发的情况下。事务的核心特性被称为 ACID 原则,它确保了数据的一致性、可靠性和正确性。

事务的 ACID 特性

ACID 是事务管理的基础,定义了事务必须遵守的四个关键属性:\

原子性(Atomicity):

原子性指的是事务中的操作要么全部执行,要么全部不执行。换句话说,事务中的所有操作是一个整体,如果其中某一步失败,整个事务都会被撤销,数据库将回到事务开始之前的状态。这确保了数据库操作的一致性,不会出现部分操作成功而其他操作失败的情况。

示例:

假设你正在进行银行账户之间的转账操作,涉及两个步骤:
------从账户A中扣除100元。
------将100元存入账户B。
如果在扣除账户A金额后,系统发生故障,事务会确保将账户A恢复到转账前的状态,而账户B的更新则不会发生。这是事务的原子性保证。

一致性(Consistency):

一致性确保事务在执行之前和执行之后,数据库的状态是合法的。在事务开始之前,数据库应该处于一致的状态,事务完成后,数据库依然会处于一致的状态。简单来说,一致性保证了数据库约束(如外键约束、唯一约束等)在事务执行过程中始终有效。

示例:

假设账户余额不能为负数,一致性保证在转账操作完成后,账户余额始终保持为合法值,任何违反约束的操作都会被回滚。

隔离性(Isolation):

隔离性确保一个事务的执行不会受到其他事务的影响。当多个事务并发执行时,每个事务都应该像是在一个独立的数据库上执行,直到它提交。不同的隔离级别提供了不同程度的隔离保护,解决了事务并发执行时可能出现的脏读、不可重复读和幻读等问题。

SQL 提供了四种常见的事务隔离级别:

  • 读未提交(Read Uncommitted): 事务可以读取其他事务未提交的数据,可能导致脏读。
  • 读已提交(Read Committed): 事务只能读取其他事务已提交的数据,避免了脏读,但可能出现不可重复读。
  • 可重复读(Repeatable Read): 事务中读取的数据在整个事务过程中保持一致,避免了不可重复读,但可能导致幻读。
  • 串行化(Serializable): 事务完全隔离,所有事务按顺序执行,避免了脏读、不可重复读和幻读,但性能可能会受到影响。

持久性(Durability):

持久性保证了一旦事务提交,其对数据库的更改将永久保存。即使在发生系统崩溃、硬件故障等情况时,已提交的事务数据也不会丢失。数据库会将已提交的数据写入磁盘,确保数据持久保存。

示例:

你完成了一次银行转账操作,并提交了事务。即使系统崩溃,转账的结果仍然会被保存,账户的余额也不会丢失。

如何管理 SQL 事务?

SQL 提供了几条基本的语句来控制事务的执行,帮助我们在实际应用中管理事务的生命周期。

开始事务(BEGIN TRANSACTION)

通过 BEGIN TRANSACTION 或 START TRANSACTION 开始一个新的事务。事务开始后,所有的数据库操作都将属于这个事务,直到事务被提交或回滚。

BEGIN TRANSACTION;
-- 或者
START TRANSACTION;

提交事务(COMMIT)

当事务中的所有操作都成功执行后,我们通过 COMMIT 命令提交事务,这样所有的更改将被永久保存。

COMMIT;

回滚事务(ROLLBACK)

如果在事务执行过程中出现错误,可以使用 ROLLBACK 来撤销事务中的所有操作,数据库将回到事务开始之前的状态。

ROLLBACK;

保存点(SAVEPOINT)

保存点允许我们在事务中设置一个中间检查点,如果事务出现问题,可以回滚到指定的保存点,而不是回滚整个事务。这为错误处理提供了更大的灵活性。

SAVEPOINT savepoint_name;
-- 执行一些操作
ROLLBACK TO SAVEPOINT savepoint_name;  -- 回滚到保存点

MySQL 事务管理

MySQL 事务使用 BEGIN(或 START TRANSACTION) 开始事务,使用 COMMIT 提交事务,使用 ROLLBACK 进行回滚。我们来看一下 MySQL 的事务操作:
在这里插入图片描述

如果在事务执行过程中发生了错误,我们可以使用 ROLLBACK 来回滚事务:
在这里插入图片描述

MyBatis 事务管理

MyBatis 允许手动管理事务,这通常适用于未集成 Spring 的独立 MyBatis 项目。我们需要使用 SqlSession 对象来管理事务:

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;public class TransactionExample {public static void main(String[] args) {SqlSessionFactory sqlSessionFactory = MyBatisUtil.getSqlSessionFactory(); // 获取 SqlSessionFactorySqlSession sqlSession = sqlSessionFactory.openSession(); // 获取 SqlSession(默认关闭自动提交)try {// 执行数据库操作AccountMapper accountMapper = sqlSession.getMapper(AccountMapper.class);accountMapper.debit(1, 100);  // 从账户1扣款accountMapper.credit(2, 100); // 给账户2加款sqlSession.commit(); // 提交事务} catch (Exception e) {sqlSession.rollback(); // 发生异常时回滚事务e.printStackTrace();} finally {sqlSession.close(); // 关闭 SqlSession}}
}

在 openSession() 方法中,默认 autoCommit=false,所以我们需要手动 commit() 提交事务或 rollback() 回滚事务。

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

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

相关文章

【软考-架构】11.3、设计模式-新

✨资料&文章更新✨ GitHub地址:https://github.com/tyronczt/system_architect 文章目录 项目中的应用设计模式创建型设计模式结构型设计模式行为型设计模式 💯考试真题题外话 项目中的应用 在实际项目中,我应用过多种设计模式来解决不同…

观察者模式详解:用 Qt 信号与槽机制深入理解

引言 你是否曾遇到这样的需求:一个对象的状态发生变化后,希望通知其他对象进行相应的更新?比如: 新闻订阅系统:当新闻发布后,所有订阅者都会收到通知。股票行情推送:股价变化时,所…

流量分析实践

下载附件使用wireshark打开,发现数据包非常多,一共有1万多条数据,我们点击分析来看一下协议分级 然后我们再来看一下会话,看有哪些ip地址, 我们通过会话结合大部分的流量发现,172.17.0.1一直在请求172.17.0…

新手村:混淆矩阵

新手村:混淆矩阵 一、前置条件 知识点要求学习资源分类模型基础理解分类任务(如二分类、多分类)和常见分类算法(如逻辑回归、决策树)。《Hands-On Machine Learning with Scikit-Learn》Python基础熟悉变量、循环、函…

MYSQL库的操作

目录 一、创建数据库 二、字符集和校验规则 1、查看系统默认字符集以及校验规则 2、查看系统支持的所有字符集以及字符集校验规则 3、指定字符集以及校验规则来创建数据库 4、校验规则对数据库的影响 三、操纵数据库 1、查看数据库 2、修改数据库 3、删除数据库 4、数…

Next App Router(下)

五、loading 新增 app/loading.tsx 页面 const Loading () > {return <div>Loading...</div>; }; export default Loading;修改 app/page.tsx页面 /** 假设为一个获取数字的api */ const fetch_getNumber async (): Promise<number> > {return ne…

【JAVA】】深入浅出了解cookie、session、jwt

文章目录 前言一、首先了解http的cookie是什么&#xff1f;Cookie 属性及其含义1. NameValue2. Expires3. Max-Age4. Domain5. Path6. Secure7. HttpOnly8. SameSite示例 Cookie 分类1. Session Cookies2. Persistent Cookies3. First-Party Cookies4. Third-Party Cookies 二、…

【css酷炫效果】纯CSS实现粒子旋转动画

【css酷炫效果】纯CSS实现粒子旋转动画 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90492008 缘 创作随缘&#xff0c;不定时更新。 创作背景 刚看到csdn出活动了&…

C++Lambda表达式

Lambda表达式 什么是Lambda表达式 ​ C11的颁布让C丰富了起来&#xff0c;任何一本介绍C11的书籍&#xff0c;都不可能跳过这一个点——Lambda表达式。人们经常称Lambda表达式是一个语法糖&#xff0c;说明这是一个”没有没事&#xff0c;有了更好“的一种语法表达&#xff0…

每天五分钟深度学习框架pytorch:基于pytorch搭建循环神经网络RNN

本文重点 我们前面介绍了循环神经网络RNN,主要分析了它的维度信息,其实它的维度信息是最重要的,一旦我们把维度弄清楚了,一起就很简单了,本文我们正式的来学习一下,如何使用pytorch搭建循环神经网络RNN。 RNN的搭建 在pytorch中我们使用nn.RNN()就可以创建出RNN神经网络…

el-table树形表格合并相同的值

el-table树形表格合并相同的值 el-table树形表格合并相同的值让Ai进行优化后的代码 el-table树形表格合并相同的值 <style lang"scss" scoped> .tableBox {/deep/ &.el-table th:first-child,/deep/ &.el-table td:first-child {padding-left: 0;} } …

2025年3月19日 十二生肖 今日运势

小运播报&#xff1a;2025年3月19日&#xff0c;星期三&#xff0c;农历二月二十 &#xff08;乙巳年己卯月丁亥日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;兔、虎、羊 需要注意&#xff1a;猪、猴、蛇 喜神方位&#xff1a;正南方 财神方位&#xff1a;…

Git——分布式版本控制工具使用教程

本文主要介绍两种版本控制工具——SVN和Git的概念&#xff0c;接着会讲到Git的安装&#xff0c;Git常用的命令&#xff0c;以及怎么在Vscode中使用Git。帮助新手小白快速上手Git。 1. SVN和Git介绍 1.1 SVN 集中式版本控制工具&#xff0c;版本库是集中存放在中央服务器的&am…

QT5.15.2加载pdf为QGraphicsScene的背景

5.15.2使用pdf 必须要安装QT源码&#xff0c;可以看到编译器lib目录已经有pdf相关的lib文件&#xff0c;d是debug 1.找到源码目录&#xff1a;D:\soft\QT\5.15.2\Src\qtwebengine\include 复制这两个文件夹到编译器的包含目录中:D:\soft\QT\5.15.2\msvc2019_64\include 2.找…

【H2O2 | 软件开发】前端深拷贝的实现

目录 前言 开篇语 准备工作 正文 概述 JSON方法 递归 其他 结束语 前言 开篇语 本系列为短篇&#xff0c;每次讲述少量知识点&#xff0c;无需一次性灌输太多的新知识点。该主题文章主要是围绕前端、全栈开发相关面试常见问题撰写的&#xff0c;希望对诸位有所帮助。…

Docker - 切换源 (Linux / macOS)

文章目录 Linux 系统macOS 系统 Linux 系统 修改配置文件&#xff1a;/etc/docker/daemon.json "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com"]验证是否修改成功&#xff1a; docker info重启 …

hcia复习

一、网络设备 1、交换机&#xff1a;&#xff08;1&#xff09;提供MAC地址表&#xff0c;转发数据&#xff1b; &#xff08;2&#xff09;每个接口是一个独立的冲突域&#xff1b; &#xff08;3&#xff09;凡是连在交换机上的所有设备都处于同一广播域&#xff08;网络&am…

opencv初步学习——图像处理3

这一部分我们将学习opencv中对图像大小进行调整的基本操作&#xff0c;以及掩模操作&#xff0c;我们直接进入正言 一、cv2.resize( )函数 1-1、组成与构造 该函数的作用就算用来帮助我们实现对图像大小的处理&#xff0c;具体的组成与构造如下&#xff1a; cv2.resize(src , …

[LevelDB]关于LevelDB存储架构到底怎么设计的?

本文内容组织形式 LevelDB 存储架构重要特点总体概括LevelDB中内存模型MemTableMemTable的数据结构背景&#xff1a;SkipListSkiplist的数据结构 Skiplist的数据访问细节 SkipList的核心方法Node细节源代码 MemTable的数据加速方式Iterator 的核心方法 MemTable 的读取&写入…

【存储中间件】Redis核心技术与实战(四):Redis高并发高可用(Redis集群 Smart客户端、集群原理)

文章目录 Redis集群Smart客户端smart客户端原理ASK 重定向集群下的Jedis客户端Hash tags 集群原理节点通信通信流程Gossip 消息节点选择 故障转移故障发现主观下线客观下线 故障恢复资格检查准备选举时间发起选举选举投票替换主节点 故障转移时间 集群不可用判定集群读写分离 个…