JDBC事务管理、四大特征(ACID)、事务提交与回滚、MySQL事务管理

目录

一、什么是JDBC事务?

(1)事务概念。

(2)JDBC事务的实现。

1、提交。

2、回滚。

(3)生活中可以类比 JDBC 事务的例子。

1、以网上购物为例。

二、JDBC的四大事务(ACID)特征。

(1)基本概念。

(2)四大特征(ACID)。

1、原子性。(Atomicity)

2、一致性。(Consistency)

3、隔离性。(Isolation)

4、持久性。(Durability)

三、有关MySQL的事务提交。

(1)MySQL的事务自动提交??

1、查看是否自动提交:autocommit。(系统变量)

2、关闭MySQL的事务自动提交。

3、开启2个命令行窗口连接mysql服务器。

4、测试MySQL的事务隔离性。

5、演示回滚操作。

四、事务结束(提交与回滚)。

1、提交(COMMIT)。

2、回滚(ROLLBACK)。


一、什么是JDBC事务?

(1)事务概念。
  • JDBC(Java Database Connectivity)事务是指一系列作为单个逻辑工作单元执行的数据库操作,这些操作要么全部成功——>提交,要么全部失败——>回滚,从而确保数据的一致性和完整性
  • 在JDBC中一般情况下都是默认自动的提交事务。

  • 在同一个事务下,一组sql语句,要就全部成功,要求全部失败,不允许出现中间状态.
  • 不允许出现中间状态。当一方成功,一方失败时,在事务的概念就是让双方都变成失败!也就是就算成功了——>也会进行回滚(还原)。

(2)JDBC事务的实现。
  • 关于事务的实现与操作——是数据库(如:MySQL)提供服务的。

  • 其中它的Connection对象的三个方法与事务相关。

  • setAutoCommit(boolean)方法:设置是否为自动提交事务。

  • 如果true(默认值就是true)表示自动提交,也就是每条执行的SQL语句都是一个单独的事务,如果设置false,那么就相当于开启了事务了;Connection对象.setAutoCommit(false)表示开启事务!!!


1、提交。
  • commit()方法:提交结束事务。Connection对象.commit()

  • 表示提交事务。一般写在代码靠后边,且没有异常,执行commit()。也就是一般写在try中


2、回滚。
  • rollback()方法:回滚结束的事务。Connection对象.rollback()

  • 表示回滚事务:一般当出现异常的时候,执行rollback()。所以一般写在catch块中


(3)生活中可以类比 JDBC 事务的例子。
1、以网上购物为例。
  • 场景描述:当你在网上购物时,从选择商品、提交订单到支付货款,这一系列操作构成一个事务。

  • 原子性体现:你提交订单时,系统会尝试从你的账户中扣除相应的货款,同时更新商家的库存和订单状态等信息。这些操作必须全部成功,要么都执行,完成购物流程;要么都不执行,回到购物前的状态,不存在只扣除货款但订单未生成,或者订单生成但货款未扣除等中间状态。

  • 一致性体现:在购物前后,你的账户余额、商家的库存以及订单系统中的数据等都要保持一致性。比如,你购买了一件商品,支付成功后,你的账户余额减少,商家的库存相应减少,订单状态变为已支付,整个系统的数据始终保持平衡和一致。

  • 隔离性体现:假设同时有多个用户在进行购物操作,每个用户的购物事务之间是相互隔离的。比如你在购买商品 A 的同时,另一个用户在购买商品 B,你们的操作互不干扰,各自的订单生成、库存更新、账户扣款等操作都独立进行,不会出现混淆或相互影响的情况。

  • 持久性体现:当你完成支付,购物事务提交成功后,即使购物网站出现故障或你关闭了浏览器,你的订单信息、账户余额变化以及商家的库存更新等都已被持久化存储到数据库中,不会丢失。你可以随时查看订单状态,商家也能正常处理你的订单,数据的修改是永久性的。

二、JDBC的四大事务(ACID)特征。

(1)基本概念。
  • ACID:是指数据库事务正确执行的四个基本特征。
  • 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这四个特征简称"ACID"。

(2)四大特征(ACID)。
1、原子性。(Atomicity)
  • 事务是一个不可分割的工作单位,事务中的所有操作要么全部成功,要么全部失败回滚。
  • 也就是说,事务中的操作是一个整体,如同一个原子,不能再被分割成更小的部分进行单独处理。
  • 也就是某一个事务在执行sql语句时,它是一个原子操作。

  • 举例说明
  • 在银行转账操作中,从账户 A 转出 100 元到账户 B,这个事务包含了两个操作:一是从账户 A 的余额中减去 100 元,二是在账户 B 的余额中加上 100 元。这两个操作必须作为一个整体来执行,要么都成功执行,账户 A 的余额减少 100 元,同时账户 B 的余额增加 100 元;要么都不执行,两个账户的余额都保持不变,不存在部分执行的中间状态


2、一致性。(Consistency)
  • 事务必须使数据库从一个一致状态变换到另一个一致状态

  • 举例说明
  • 还是以银行转账为例,在转账事务开始前,所有账户的余额总和是一个固定值。
  • 当转账事务执行完成后,无论转账是否成功,所有账户的余额总和应该与事务开始前保持一致。如果转账成功,那么账户 A 的余额减少,账户 B 的余额增加,总余额不变;如果转账失败,两个账户的余额都不变,总余额也不变,从而保证了数据的一致性

  • 事务开始之前和结束之后,数据库的完整性约束没有被破坏,数据始终保持一致

  • 3、隔离性。(Isolation)
  • 多个事务并发执行时,一个事务的执行不能被其他事务干扰,各个事务之间相互隔离,如同每个事务都在一个独立的环境中执行一样。
  • 每个事务都感觉不到有其他事务在并发地执行,从而保证了每个事务的独立性和数据的准确性。也就是不同的事务并发操作相同的数据时每个事务都有各自完整的数据空间

  • 这里面可能用到了数据库的"行锁"!类似于多线程,当一个事务在执行sql语句时,对数据进行增加、删除、修改时,其它事务是不允许进行操作的。
  • 当某个事务在进行操作后且并没有提交时,其它事务是需要等待——>才能进行操作!

  • 举例说明
  • 假设有两个用户同时对不同的账户进行操作,用户 A 从账户 C 向账户 D 转账,用户 B 从账户 E 向账户 F 转账。
  • 这两个转账操作是两个独立的事务,在理想情况下,它们应该互不干扰,各自按照自己的流程执行,就好像是顺序执行一样,不会出现一个事务的操作影响到另一个事务的中间结果或最终结果的情况。

4、持久性。(Durability)
  • 一旦事务提交成功,其对数据库中数据的改变就是永久性的
  • 即使数据库系统出现故障,如断电、崩溃等,这些修改也不会丢失,数据会被持久化到数据库中。

  • 也就是:事务的持久性是指事务一旦提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态。
  • MySQL是通过写"日志文件"完成。MySQL会把操作先写到日志文件中,再去操作数据将其写到硬盘当中。

  • 举例说明
  • 当银行转账事务提交后,数据库会将账户余额的变化记录到磁盘等存储介质上。
  • 即使在提交事务后,数据库系统立即发生故障重启,重新恢复运行后,之前提交的转账操作对账户余额的修改依然存在,不会因为系统故障而回滚或丢失,确保了数据的持久性。

事务的这四大特征是保证数据库数据完整性和一致性的重要机制,在数据库操作以及各种涉及数据处理的系统中都起着关键作用。

三、有关MySQL的事务提交。

(1)MySQL的事务自动提交??
  • MySQL 默认是自动提交事务的,即每一条 SQL 语句都会被当作一个单独的事务自动执行并提交。

  • MySQL中有一个系统变量可以查看事务是否自动提交。
1、查看是否自动提交:autocommit。(系统变量)
  • 登录进入mysql——>通过"show"命令查看"autocommit"全局变量,可以查看MySQL的事务的自动提交是否被打开。
show variables like 'autocommit';

  • 命令行登录mysql——>可以查看到MySQL已经默认自动提交事务。
  • ON表示已关闭自动提交


  • 原因:
  • MySQL在事务进行过程中,未结束之前,它的DML语句是不会更改底层数据,只是将历史操作记录一下,在内存中完成记录,不会在硬盘完成更新记录。
  • 只有在事务结束的时候,而且是成功的结束的时候,才会修改底层硬盘文件中的数据

2、关闭MySQL的事务自动提交。
  • 注意这里的操作是临时的关闭,而且只在当前命令行窗口生效!。真正的关闭需要改其配置文件!

  • 具体的操作命令。
SET AUTOCOMMIT=0;         #表示禁止MySQL的自动提交
SET AUTOCOMMIT=1;         #表示开启MySQL的自动提交

  • cmd命令行演示。OFF表示已关闭自动提交


3、开启2个命令行窗口连接mysql服务器。
  • 此时再开启一个命令行窗口——连接mysql服务器。
  • 可以清楚的发现——在命令行关闭mysql事务自动提交是临时的,且单独作用一个cmd窗口!


4、测试MySQL的事务隔离性。
  • 第一个cmd窗口(关闭事务自动提交)修改表的数据,但不提交事务。

  • 第二个cmd窗口查询"第一个cmd窗口修改的表",看是否能看到"修改后"的表!
  • (答案肯定是不能!因为第一个cmd窗口事务未提交!不会修改硬盘中的数据,只会修改内存中的数据

  • 由于一个事务修改对应的表数据后,没有结束(提交事务)。当另外一个窗口执行查看数据时,硬盘里面的数据还是原来的,并没有修改。


  • 当使用命令:commit。就可以了提交事务,另外一边也成功看到修改的数据情况了。


  • 而且cmd窗口1的一个事务执行修改表数据的sql,且不主动提交事务。也就是这条事务 在执行修改某行数据加了"行锁"。
  • 而另外cmd窗口2一个事务也去执行修改的sql语句,这时它会卡着(一直等待提交)——事务隔离性。



5、演示回滚操作。

四、事务结束(提交与回滚)。

  • 事务的结束通常有两种方式,即提交(COMMIT)和回滚(ROLLBACK)。

1、提交(COMMIT)。

(程序中sql都执行成功时——>执行事务提交操作)

  • 具体含义
  • 当执行 COMMIT 语句时,意味着事务中的所有操作都已成功完成,并且对数据库所做的所有更改都将被永久性地保存到数据库中。
  • 注意:一旦提交事务后,这些更改将成为数据库的新状态,对其他并发事务可见,并且在数据库系统出现故障后也不会丢失

  • 示例:假设在一个银行转账事务中,需要从账户 A 向账户 B 转账 1000 元。事务包含两个操作:从账户 A 的余额中减去 1000 元,以及在账户 B 的余额中加上 1000 元。当这两个操作都成功执行后,执行 COMMIT 语句,此时数据库中账户 A 的余额减少 1000 元,账户 B 的余额增加 1000 元的状态将被永久保存,转账操作完成且数据一致性得到保证。

  • 注意事项:在提交事务之前,应该确保事务中的所有操作都符合业务逻辑和数据一致性的要求。提交后的数据将无法通过简单的回滚操作恢复,除非使用数据库的备份或其他恢复机制。某一个事务不允许重复的去提交!

2、回滚(ROLLBACK)。

(程序中有的sql执行成功,有的sql执行失败。执行成功的sql通过进行回滚操作,恢复到执行之前的状态)

  • 具体含义
  • ROLLBACK 语句用于撤销事务中已执行的所有操作将数据库恢复到事务开始之前的状态
  • 也就是当事务执行过程中出现错误,或者由于某些原因导致事务无法继续正常执行时,通常会使用 ROLLBACK 来取消已做的更改,以保证数据的一致性。

  • 示例:在上述银行转账事务中,如果在从账户 A 减去 1000 元后,由于网络故障等原因导致向账户 B 增加 1000 元的操作无法执行,此时就需要执行 ROLLBACK 语句。执行后,账户 A 的余额将恢复到转账前的数值,就好像整个转账事务从未发生过一样,从而避免了数据不一致的情况。

  • 注意事项:回滚操作应该谨慎使用,因为它会撤销事务中所有已执行的操作。在复杂的事务中,可能包含了多个对不同数据表的操作,回滚将把所有这些操作的结果都撤销。此外,回滚操作只能撤销未提交的事务,如果事务已经提交,则无法通过 ROLLBACK 来恢复数据,除非使用数据库的日志恢复等高级功能。

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

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

相关文章

操作系统离散存储练习题

1. (简答题)分页存储管理系统具有快表,内存访问时间为2ns,检索快表时间为0.5ns,快表命中率为80%,求有效访问时间 -分析:首先访问缓存(快表),如果没有找到访问内存(页表&…

【AI日报】2024年11月13号

我回来啦!!发现自己好久不发文章了。 在某头部AI公众号实习的过程中,学到太多太多了,也感谢某位大神的指点,也衷心祝愿他的IP可以越做越好 之后因为时间关系,可能要自己出来单干了。 在实习过程中学到的…

inline内联函数(C++)

a)⽤inline修饰的函数叫做内联函数,编译时C编译器会在调⽤的地⽅展开内联函数,这样调⽤内联函数就不需要建⽴栈帧了,就可以提⾼效率。 b)inline对于编译器⽽⾔只是⼀个建议,也就是说,你加了inl…

C++builder中的人工智能(27):如何将 GPT-3 API 集成到 C++ 中

人工智能软件和硬件技术正在迅速发展。我们每天都能看到新的进步。其中一个巨大的飞跃是我们拥有更多基于自然语言处理(NLP)和深度学习(DL)机制的逻辑性更强的AI聊天应用。有许多AI工具可以用来开发由C、C、Delphi、Python等编程语…

Harmony- List组件最后一个item显示不全

在使用List组件显示数据的时候会出现最后一个item显示不全的问题,如下 出现在高度问题上,如果List组件上下没有其他占位组件就是正常显示的 解决方案: 1.给List组件加上layoutWeight(1),使它填满父控件剩余空间; 2.还有一种情况…

neo4j desktop基本入门

下载安装不在赘述,本文只记述一些neo4j的基本入门操作 连接本地neo4j数据库 1. 点击ADD添加连接 端口一般是7687 账户名和密码忘记了,可以通过neo4j web(默认为neo4jneo4j://localhost:7687/neo4j - Neo4j Browser)重置密码 AL…

function and task

任务和函数 在Verilog语言中提供了任务和函数,可以将较大的行为级设计划分为较小的代码段,允许设计者将需要在多个地方重复使用的相同代码提取出来,编写成任务和函数,这样可以使代码更加简洁和易懂。 1.1任务 任务的定义 任务定义…

24/11/13 算法笔记<强化学习> DQN算法

DQN算法的主要特点包括: 神经网络代替Q表:在传统的Q学习中,需要维护一个Q表来存储每个状态-动作对的Q值。而在DQN中,使用神经网络来近似这些Q值,这使得算法能够处理具有大量状态和动作的问题。 经验回放(E…

blind-watermark - 水印绑定

文章目录 一、关于 blind-watermark安装 二、bash 中使用三、Python 调用1、基本使用2、attacks on Watermarked Image3、embed images4、embed array of bits 四、并发五、相关 Project 一、关于 blind-watermark Blind watermark 基于 DWT-DCT-SVD. github : https://githu…

Qt_day10_程序打包(完结)

目录 1. 设置图标 2. Debug和Release版本 3. 动态链接库 4. 打包 5. 联系项目要求 Qt开发的程序最终都是要给用户使用的,用户的电脑上不可能装一个Qt的开发环境导入项目使用。因此项目项目开发完成后需要打包——制作成安装包,用户直接下载并安装即可使用…

【C语言】指针的运算

指针的增量操作: int i 10; int *p &i;printf("p %p\n", p);//1024p; // 增加int 4个字节大小printf("p %p\n", p);//1028指针的增量运算取决于指针的数据类型,它将会增加数据类型的大小的字节。 指针的减量操作与增量同理…

C++builder中的人工智能(28):FANN: Fast Artificial Neural Networks快速人工神经网络(ANNs)

这篇文章全面介绍了快速人工神经网络(ANNs)的世界,探讨了它们在现代计算智能中的重要地位、核心特点、应用领域以及未来发展。 快速人工神经网络库(Fast Artificial Neural Network Library,简称FANN)是一…

零基础Java第十六期:抽象类接口(二)

目录 一、接口(补) 1.1. 数组对象排序 1.2. 克隆接口 1.3. 浅拷贝和深拷贝 1.4. 抽象类和接口的区别 一、接口(补) 1.1. 数组对象排序 我们在讲一维数组的时候,使用到冒泡排序来对数组里的元素进行从小到大或从大…

wafw00f源码详细解析

声明 本人菜鸟一枚,为了完成作业,发现网上所有的关于wafw00f的源码解析都是这抄那那抄这的,没有新东西,所以这里给出一个详细的源码解析,可能有错误,如果有大佬发现错误,可以在评论区平和的指出…

Bilibili-超能用户榜入口优化-技术方案反思与总结

目录 客户端实现: 高能用户入口实现逻辑: 接口服务信息(服务端下发): 执行方案: (1)数据类新增服务端下发字段 ​编辑 (2) UI添加 寻找思路: (3)超能用户icon显示…

终端打开程序、为什么要用pycharm

方法一:cd文件路径 方法二:输入cmd 为什么终端可以运行python代码,还需要pycharm?——让写代码的过程更加简单 学习视频:【最详细的 Windows 下 PyTorch 入门深度学习环境安装与配置 CPU GPU 版 | 土堆教程】https://w…

深度了解flink(十一) 心跳机制详解

前言 在Flink的各个服务组件中,ResourceManager、JobMaster、TaskExecutor三者之间存在相互检测的心跳机制:ResourceManager会主动发送心跳请求探测JobMaster、TaskExecutor是否存活;JobMaster也会主动发送心跳请求探测TaskExecutor是否存活…

华为策略路由配置

一、本地策略路由 要求: 长度为64~1400字节的报文走g0/0/0链路 长度为1401~1500字节的报文走g0/0/1链路 1.启动设备 2.配置IP地址 [AR1]int g0/0/0 [AR1-GigabitEthernet0/0/0]ip add 150.1.1.1 24 [AR1-GigabitEthernet0/0/0]int g0/0/1 [AR1-GigabitEther…

Html Area 图像映射可点击区域 实现响应式图像映射

Html Area 图像映射可点击区域 实现响应式图像映射 主要实现了图片的分区域点击,可以自定义点击的区域,根据点击的位置不同,执行不同的方法或者跳转不同的网页 介绍 引用w3school的Demohttps://www.w3school.com.cn/tags/tag_area.asp#googl…

Python爬虫知识体系-----requests-----持续更新

数据科学、数据分析、人工智能必备知识汇总-----Python爬虫-----持续更新:https://blog.csdn.net/grd_java/article/details/140574349 文章目录 一、安装和基本使用二、get请求三、post请求四、代理 一、安装和基本使用 和解析库urllib几乎一摸一样,但是…