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

news2025/5/15 0:23:19

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(); // 获取 SqlSessionFactory
        SqlSession 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.coloradmin.cn/o/2317954.html

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

相关文章

基于STM32的火灾报警设备(阿里云平台)

目录 前言: 一、项目介绍和演示视频 二、硬件需求准备 三、硬件框图 1. 原理图 2. PCB 四、CubeMX配置 五、代码框架 前言: 源代码下载链接: https://download.csdn.net/download/m0_74712453/90474701 需要实物的可以私信博主或者…

FPGA-流水灯

Quartus中使用Verilog实现 根据之前所学内容,打开Quartus 软件,新建FPGA项目文件,建立好空项目过后,选择Verilog HDL File,因为我们要使用Verilog代码实现仿真。 详细操作可参考往期博客: FPGA 实验报告&a…

browser-use WebUI + DeepSeek 基于AI的UI自动化解决方案

browser-use WebUI 一、browser-use是什么Browser-use采用的技术栈为: 二、browser-use webui 主要功能使用场景 三、使用教程1.python 安装2、把项目clone下来3、安装依赖4、配置环境5、启动6、配置1.配置 Agent2.配置要用的大模型3.关于浏览器的一些设置 四、Deep…

什么是YApi?开源接口管理平台部署教程

YApi 到底是个啥? 各位小伙伴们好呀!今天要给大家介绍的是一款超级好用的接口管理神器——YApi!它是一个高效、易用、功能强大的 API 管理平台,简直就是开发、产品、测试人员的福音啊!!!它能帮…

深入理解事务

在数据库管理中,事务是一个至关重要的概念。无论是金融交易、库存管理还是用户数据更新,事务都确保了数据的完整性和一致性。本文将详细介绍为什么需要事务、什么是事务、事务的四大特征、如何在MySQL中使用事务以及MyBatis对事务的配置。 一、为什么需…

基于SpringBoot + Vue 的药店药品信息管理系统

基于SpringBootVue的药品药店药房信息系统(带文档) 角色: 用户,管理员,员工 功能: 管理员: 首页、个人中心、用户管理、员工管理、药品类别管理、药品信息管理、药品入库管理、药品出库管理、在线咨询管理、留言板管理、系统管理、订单管理。 用户:…

ubuntu下TFTP服务器搭建

tftp 命令的作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中,只是 tftp 命令 使用的 TFTP 协议, Ubuntu 主机作为 TFTP 服务器。因此需要在 Ubuntu 上搭建 TFTP 服务器, 需要安装 tftp-hpa 和 tftpd-hpa,命令…

解决:ModuleNotFoundError: No module named ‘_sqlite3‘

报错: from _sqlite3 import * ModuleNotFoundError: No module named _sqlite3安装sqlite3支持组件: sudo apt-get install libsqlite3-dev进入之前下载的python包下,重新编译和安装Python ./configure --enable-loadable-sqlite-extensions make &a…

技术债务的隐患:何时重构,何时妥协?

在快节奏的软件开发环境中,企业为了抢占市场或满足紧迫需求,往往不得不在短期内采取“捷径”来加速产品交付,这便引入了“技术债务”。短期内看似能迅速交付,但随着时间推移,这些未优化的代码和架构缺陷会逐渐累积&…

c#Winform也可以跨平台了GTK框架GTKSystem.Windows.Forms

一、简介 >> 新版下载,问题求助 QQ群:1011147488 1032313876 236066073(满) Visual Studio原生开发,无需学习,一次编译,跨平台运行. C#桌面应用程序跨平台(windows、linux、…

ABAP PDF预览

画个屏幕 PDF JPG TXT都可以参考预览,把二进制流传递给标准函数就行 *&---------------------------------------------------------------------* *& Report YDEMO2 *&---------------------------------------------------------------------* *&am…

网络爬虫【爬虫库urllib】

我叫不三不四,很高兴见到大家,欢迎一起学习交流和进步 今天来讲一讲爬虫 urllib介绍 Urllib是Python自带的标准库,无须安装,直接引用即可。 Urllib是一个收集几个模块来使用URL的软件包,大致具备以下功能。 ● urlli…

卷积神经网络 - 卷积层

卷积神经网络一般由卷积层、汇聚层和全连接层构成,本文我们来学习卷积层。 卷积层(Convolutional Layer)是卷积神经网络(CNN)的核心组件,专门用于处理具有网格结构的数据(如图像、音频、时间序…

玩转 Tailwind CSS:深入解析函数与指令

玩转 Tailwind CSS:深入解析函数与指令 如果你正在使用 Tailwind CSS,可能已经习惯了各种 text-center、mt-4 这样的类名,但你知道吗?Tailwind 其实还隐藏着一套 强大的函数与指令系统,可以让你的代码更加优雅、可维护…

Axure设计之下拉多选框制作教程C(中继器)

利用Axure制作下拉多选器组件可以极大地提升原型制作的效率和效果。以下是基于你提供的详细步骤的详细指导,帮助你在Axure中实现一个功能完善、高保真且可复用的下拉多选器组件。 一、案例预览 预览地址:https://pghy0i.axshare.com 实现效果包括&#…

Java基础语法练习42(基本绘图-基本的事件处理机制-小坦克的绘制-键盘控制坦克移动)

目录 一、图形的基本绘制 1.基本介绍: 2.入门代码如下: 3.常用图形的绘制, 示例代码如下: 二、坦克的绘制 三、事件处理机制 四、坦克的移动 一、图形的基本绘制 1.基本介绍: Component 类提供了两个和绘图相关最重要的方…

RabbitMQ 入门

RabbitMQ 入门 1RabbitMQ 介绍 RabbitMQ 是信息传输的中间者。本质上,他从生产者(producers)接收消息,转发这些消息给消费者(consumers).换句话说,他能够按根据你指定的规则进行消息转发、缓冲…

yolo环境 pytorch环境配置 CUDA安装

我的成功案例:首先安装python 3.12.9的conda虚拟环境 (如果不安装3.12的会报错误ModuleNotFoundError:没有名为“numpy._core”的模块) 然后安装11.8cuda (其实我是可以最高安装12.6的cuda但我实测,太高版…

ESP32(4)TCP通信

本章重点讲解 lwIP 的 Socket接口如何配置 TCP客户端,并在此基础上实现收发功能。 TCP Client 连接流程 在实现 TCP 协议之前,用户需要按照以下步骤配置结构体 sockaddr_in 的成员变量,以便建立 TCPClient 连接: ①:…

数学建模:MATLAB循环神经网络

一、简述 1.循环神经网络 循环神经网络(RNN)是一种用于处理序列数据的神经网络。不同于传统的前馈神经网络,RNN在隐藏层中加入了自反馈连接,使得网络能够对序列中的每个元素执行相同的操作,同时保持一个“记忆”状态…