Java学习手册:数据库事务相关知识

在这里插入图片描述

一、事务的概念与特性

  • 概念 :事务是数据库中一系列操作的集合,这些操作要么全部成功,要么全部失败,是一个不可分割的工作单位。例如,在银行转账系统中,从一个账户扣款和向另一个账户存款这两个操作必须作为一个事务来执行,要么都成功,要么都失败,否则就会导致数据不一致。
  • ACID 特性
    • 原子性(Atomicity) :事务中的操作要么全部完成,要么全部不完成,不会停留在中间状态。例如,在网上书店的订单处理中,如果订单创建和库存减少这两个操作属于同一个事务,那么它们要么都成功执行,要么都回滚,不会出现只创建了订单但未减少库存的情况。
    • 一致性(Consistency) :事务执行前后,数据库从一个一致状态转换到另一个一致状态。例如,在航空售票系统中,事务确保在机票预订后,座位数量不会出现负数或超过实际可用数量的情况。
    • 隔离性(Isolation) :并发执行的事务之间互不干扰,一个事务的执行不能被其他事务干扰。例如,在多用户同时访问在线购物网站时,事务隔离性确保一个用户的购物车更新不会影响其他用户的购物体验。
    • 持久性(Durability) :事务完成后,其对数据库的修改是永久的,即使系统发生故障也不会丢失。例如,银行转账完成后,即使服务器突然宕机,转账记录和账户余额的更新也不会丢失。

二、事务的类型

  • 读写事务 :对数据库进行读取和写入操作的事务。例如,在线学习平台中,学生提交作业和教师批改作业的操作通常属于读写事务,因为它们会更新数据库中的记录。
  • 只读事务 :只对数据库进行读取操作的事务。例如,在电商网站上浏览商品信息的操作通常属于只读事务,因为它只是查询数据库中的商品数据,而不会对其进行修改。

三、事务的并发问题

  • 脏读 :一个事务读取了另一个事务尚未提交的数据。例如,事务 A 读取了事务 B 更新但尚未提交的数据,之后事务 B 回滚,事务 A 读取到的数据就与数据库的实际状态不符。
  • 不可重复读 :在一个事务中,多次读取同一数据得到不同的结果。例如,事务 A 先读取了某条记录,然后事务 B 更新了这条记录并提交,事务 A 再次读取该记录时得到了不同的值。
  • 幻读 :一个事务在执行过程中,发现其他事务插入了新的数据,导致读取到的数据范围发生变化。例如,事务 A 按某种条件读取一组记录,事务 B 在这些记录中插入了新的满足条件的记录并提交,事务 A 再次按相同条件读取时,发现出现了新的记录。
  • 丢失更新 :两个或多个事务同时对同一数据进行更新,导致其中一个事务的更新被其他事务覆盖。例如,事务 A 和事务 B 都读取了同一账户的余额,进行更新后提交,后提交的事务覆盖了先提交的事务的更新结果。

四、事务的隔离级别

  • 未提交读(Read Uncommitted) :最低的隔离级别,允许脏读。事务可以看到其他事务尚未提交的更新。例如,在某些对数据一致性要求不高的日志系统中,可能会使用这个隔离级别以提高性能,但在大多数需要数据准确性的场景中不适用。
  • 已提交读(Read Committed) :避免了脏读,但仍然可能出现不可重复读和幻读。事务只能读取其他事务已经提交的数据。例如,在在线论坛中,用户查看帖子内容时,通常使用已提交读隔离级别,因为帖子内容一旦发布就会被提交,用户希望看到的是最新的内容,而不是担心重复读取的问题。
  • 可重复读(Repeatable Read) :确保同一个事务中多次读取同一数据得到相同的结果,避免了不可重复读和脏读,但仍然可能出现幻读。例如,在银行账户管理系统中,为确保在事务处理过程中账户余额的一致性,通常会使用可重复读隔离级别。
  • 串行化(Serializable) :最高的隔离级别,避免了脏读、不可重复读和幻读。事务之间完全隔离,按照顺序串行执行,但性能开销较大。例如,在涉及重要金融交易或高度敏感数据的场景中,可能会使用串行化隔离级别以确保数据的绝对一致性。

五、事务的传播行为

  • REQUIRED :如果当前存在事务,则加入该事务;如果不存在,则创建一个新的事务。这是默认的传播行为。例如,在一个复杂的业务流程中,多个步骤的操作都可能需要在一个事务中执行,以确保整个流程的原子性。
  • SUPPORTS :如果当前存在事务,则加入该事务;如果不存在,则以非事务的方式执行。例如,对于一些只读查询操作,如果存在事务则在事务中执行,否则单独执行,因为这些操作本身不会修改数据,对事务的依赖性较低。
  • MANDATORY :如果当前存在事务,则加入该事务;如果不存在,则抛出异常。例如,在某些必须保证操作在事务环境下执行的场景中,如关键数据的更新操作,要求调用者必须提供事务环境,否则拒绝执行。
  • REQUIRES_NEW :总是创建一个新的事务。如果当前存在事务,则将当前事务挂起,创建一个新的事务。例如,在一个分布式事务环境中,某些操作需要独立的事务边界以确保其原子性,即使在已有事务的环境下。
  • NOT_SUPPORTED :以非事务的方式执行。如果当前存在事务,则将当前事务挂起。例如,对于一些明确不需要事务的操作,如简单的查询日志记录等,可以指定该传播行为以避免不必要的事务开销。
  • NEVER :以非事务的方式执行。如果当前存在事务,则抛出异常。例如,对于某些明确设计为无事务的操作,如某些异步任务的触发操作,确保其不会受到事务环境的影响。
  • NESTED :如果当前存在事务,则创建一个嵌套事务;如果不存在,则创建一个新的事务。嵌套事务是外部事务的一部分,对外部事务的回滚有影响。例如,在一个复杂的业务流程中,某些子操作可以设计为嵌套事务,以便在子操作失败时仅回滚该子操作,而不影响整个事务的其他部分(如果支持的话)。

六、事务的管理方式

  • 自动提交 :在自动提交模式下,每个 SQL 语句都被当作一个独立的事务来执行和提交。这种方式简单,但在进行多个相关操作时,无法保证它们的原子性。例如,在命令行工具中执行单个查询或更新语句时,默认通常处于自动提交模式。
  • 手动提交 :在手动提交模式下,需要显式地开始事务、提交事务或回滚事务。这提供了对事务边界的精确控制,适用于需要将多个操作组合成一个原子性事务的场景。例如,在开发复杂的业务逻辑时,如转账程序,需要手动控制事务的开始和结束以确保数据一致性。

七、数据库事务的实际应用

  • 银行转账系统 :确保资金从一个账户转移到另一个账户时,扣款和存款操作要么都成功,要么都失败,维护了账户余额的一致性。
  • 在线购物平台 :在订单创建过程中,涉及库存减少、订单状态更新等多个操作,事务确保这些操作要么全部完成,要么在出现问题时全部回滚,避免了超卖或订单信息不一致的情况。
  • 库存管理系统 :更新库存数量时,事务防止不同用户同时操作导致的数据不一致,确保库存计数的准确性。

八、总结

数据库事务是确保数据一致性和完整性的重要机制。通过理解事务的 ACID 特性、隔离级别、传播行为以及管理方式,可以有效地设计和实现可靠的数据库应用。在实际开发中,应根据业务需求选择合适的隔离级别和事务传播行为,并合理管理事务以平衡数据一致性和系统性能。

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

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

相关文章

java复杂度,包装类,泛型解析

如何衡量代码的好坏? 评价代码的好坏我们使用算法效率来判断,而算法效率分两种: 算法效率: 第一种是时间效率,第二种是空间效率,时间效率被称为时间复杂度,⽽空间效率被称作空间复杂度。 时间…

基于 SpringBoot + Vue 的校园管理系统设计与实现

一、项目简介 本系统以校园组织管理为主线,结合用户权限分离机制与模块化设计,实现对“单位类别、单位、通知推送、投票信息、用户回复”等内容的全流程管理,广泛适用于教育局、高校及下属组织的信息管理工作。 🎯 项目亮点&…

iOS蓝牙技术实现及优化

以下是针对2025年iOS蓝牙技术实现的核心技术要点的深度解析,结合当前iOS 18(推测版本)的最新特性与开发实践,分模块结构化呈现: 一、硬件与协议层适配 BLE 5.3 支持 iOS 18默认支持蓝牙5.3协议,需注意&…

Qt 中实现观察者模式(Observer Pattern)

在 Qt 中实现**观察者模式(Observer Pattern)通常利用其内置的信号与槽(Signals & Slots)**机制,这是最符合 Qt 设计哲学的方式。以下是详细实现方法和关键点: —### 1. 观察者模式的核心思想- Subject(被观察者):维护一个观察者列表,在状态变化时通知观察者。- …

写程序,统计两会政府工作报告热词频率,并生成词云

import jieba from collections import Counter from wordcloud import WordCloud import matplotlib.pyplot as pltdef generate_wordcloud():try:# 读取文本文件with open(E:\\桌面\\s.txt, r, encodingutf-8) as file:text file.read()# 中文分词words jieba.lcut(text)# …

【Science Advances】普林斯顿大学利用非相干光打造可重构纳米光子神经网络

(导读 ) 人工智能对计算性能需求剧增,电子微处理器发展受功耗限制。光学计算有望解决这些问题,光学神经网络(ONNs)成为研究热点,但现有 ONNs 因设计缺陷,在图像分类任务中精度远低于现代电子神经网络&#…

gin + es 实践 01

项目结构说明 目录结构概览 Go-ES 项目采用领域驱动设计(DDD)架构,目录结构清晰,各层次职责分明。以下是项目的主要目录结构: go-es/ ├── cmd/ # 应用程序入口 │ └── api/ …

如何构建直播美颜SDK?从美颜API调用逻辑到GPU优化实战

随着短视频和直播行业的爆发,美颜SDK已成为各大直播平台的“标配”。从基础的磨皮、美白,到如今的AI滤镜、虚拟形象,这些功能的背后都离不开高效的美颜SDK支持。那么,如何构建一款性能优越、体验流畅的直播美颜SDK呢?本…

高组装导轨的特点

高组装导轨通常是四列式单圆弧齿形接触直线导轨,具有整合化的结构设计,适用于重负荷和精密应用。与其它直线导轨高组装导轨提升了负荷与刚性能力,具备四方向等负载特色和自动调心功能,能够吸收安装面的装配误差,达到高…

2025-05-07-FFmpeg视频裁剪(尺寸调整,画面比例不变)

原比例如图 原比例如图裁剪后的比例 代码: 方法一:极速 ffmpeg -i input.mp4 -vf "crop1080:750:0:345" -c:v libx264 -preset ultrafast -c:a copy output.mp4关键参数说明: vf “crop宽:高❌y”:定义裁剪区域。 …

一个.Net开源的协作办公套件,包括文档、表格、演示文稿和表单

从零学习构建一个完整的系统 推荐一个开源的文档协作办公套件,可以很好的满足团队对方便、高效、安全的方式来处理文档工作,促进团队协作和信息共享。 项目简介 ONLYOFFICE 是一个开源的办公套件,包括文档、表格、演示文稿和表单等应用程序…

虚幻基础:硬件输入

文章目录 triggered:按下一直触发 等于tickcompleted:必须等到triggered结束后 才触发松下triggered结束 默认按键触发顺序按下:触发两个先 Started后 Triggered 松开Completed 触发器:用于修改triggered 触发和结束驱动阈值&…

Python中的global与nonlocal关键字详解

一、前言 在Python编程中,变量作用域是一个非常重要的概念。对于初学者来说,经常会遇到在函数内部无法修改外部变量的问题。这时候,global和nonlocal关键字就能派上用场了。本文将详细介绍这两个关键字的用法、区别以及适用场景,…

vue-qr生成的二维码增加下载功能

大家好!今天给大家分享一个超实用的前端小技巧——如何在 Vue 项目中生成二维码并实现下载功能。这个功能在分享链接、活动推广等场景特别有用,一起来学习吧! 🔍 功能预览 使用 vue-qr 生成美观二维码点击按钮即可下载 PNG 格式的…

嵌入式C进阶路线指南

嵌入式是工科,工科讲究实践。说的再多、懂得再多,不能做出实际的东西,是没有意义的。学习嵌入式的核心原则之一就是多动手写代码。另外还有一个原则就是:从浅到深学习。接下来的内容将贯彻这两个原则。最后强调一点,各…

服务器上机用到的设备

服务器上机通常需要以下硬件设备: 服务器主机: CPU:选择高性能的多核处理器,如英特尔至强(Xeon)系列或AMD EPYC系列,以满足高并发和多任务处理需求。 内存(RAM)&#xf…

FreeCAD傻瓜教程-涡轮蜗杆的快速绘制FCGear工作台的使用方法

起因:涡轮蜗轴的组合,是一种比较简单且高效的传动结构。可以实现减速、加速、转动角度的放大、缩小等应用。 如何绘制呢?我搜索了不少教程,看起来都挺复杂的,对于小白来说有点像天书。这里介绍和记录一下利用FreeCAD 的…

daplink开发_一次开发DAPLink的详细开发流程及调试步骤

以下是针对第一次开发DAPLink的详细开发流程及调试步骤,结合STM32平台特性,分阶段指导您完成从零到一的完整开发过程: 一、开发流程1. 硬件准备阶段选型STM32芯片:推荐型号:STM32F103C8T6(成本低、资源足够)、STM32F405RGT6(性能更强,支持更多外设)。关键外设需求:U…

给小白的AI Agent 基本技术点分析与讲解

引言:重塑交互与自动化边界的 AI Agent 在人工智能技术飞速发展的浪潮中,AI Agent(智能体)概念的兴起标志着自动化和人机交互正迈向一个全新的阶段。传统的软件系统通常被设计来执行精确预设的指令序列,它们强大且高效…

Mysql常用语句汇总

Mysql语句分类 DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段)DML: 数据操作语言,用来对数据库表中的数据进行增删改DQL: 数据查询语言,用来查询数据库中表的记录DCL: 数据控制语言,用来创建数据…