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

devtools/2025/3/19 18:02:04/

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 开始一个新的事务。事务开始后,所有的数据库操作都将属于这个事务,直到事务被提交或回滚。

sql">BEGIN TRANSACTION;
-- 或者
START TRANSACTION;

提交事务(COMMIT)

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

sql">COMMIT;

回滚事务(ROLLBACK)

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

sql">ROLLBACK;

保存点(SAVEPOINT)

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

sql">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.ppmy.cn/devtools/168409.html

相关文章

免费看付费电影网站制作,高清电影集合搜索引擎网站

引言 在当今数字化时代,电影已经成为人们日常生活中不可或缺的一部分。然而,随着各大视频平台推出付费会员制度,许多用户开始寻找免费观看付费电影的途径。本文将详细介绍如何制作一个免费看付费电影的网站,并打造一个高清电影集…

【STM32】uwTick在程序中的作用及用法,并与Delay函数的区别

一、uwTick 的作用 1.系统时间基准 uwTick 是一个全局变量(volatile uint32_t),记录系统启动后的毫秒级时间累计值。默认情况下,它由 SysTick 定时器每 ​1ms 自动递增一次(通过 HAL_IncTick() 函数。例如&#xff0…

C语言 进阶指针学习笔记

文章目录 字符指针指针数组数组指针数组名数组传参 函数指针函数指针数组指向函数指针数组的指针 回调函数Qsort 的使用通过冒泡排序模拟实现 qsort 大部分的内容都写在代码注释中 指针有类型,指针的类型决定了指针的整数的步长,指针解引用操作的时候的权…

【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring MVC 的崛起:从 Struts 到 Spring 的演进

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、Struts…

在windows10系统上安装docker,然后在容器中运行GPU版本的Pytorch,并使用vscode连接该容器

一 . 安装Docker Desktop 首先打开网址https://docs.docker.com/desktop/install/windows-install/ 下载完后&#xff0c;双击下面的exe文件进行安装&#xff0c;默认情况下&#xff0c;Docker Desktop 安装在C:\Program Files\Docker\Docker 出现提示时&#xff0c;请确保…

ffmpeg基础整理

FFmpeg 是一个开源的跨平台 多媒体处理工具 &#xff0c;可以用于 录制、转换、编辑、流式传输 音视频文件。它支持几乎所有常见的音视频格式&#xff0c;功能极其强大&#xff0c;是开发者、视频创作者常用的命令行工具。 一、FFmpeg 核心功能 格式转换&#xff1a;将视频/音频…

【CentOS】搭建Radius服务器

目录 背景简介&#xff1a;Radius是什么&#xff1f;Radius服务器验证原理搭建Radius服务器环境信息yum在线安装配置FreeRADIUS相关文件clients.conf文件users文件重启服务 验证 参考链接 背景 在项目中需要用到Radius服务器作为数据库代理用户的外部验证服务器&#xff0c;做…

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

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