MySQL-事务(详细版)

news2024/12/23 13:47:36

目录

事务的含义

举一个例子

事务的特征(面试高频)

原子性

一致性

隔离性

持久性

事务结束

查看事务提交方式

查看事务提交的变量值:on 自动提交 off 不是自动提交

实例

事务回滚

验证事务回滚

事务实现:是数据库提供

jdbc事务

Connection的三个方法与事务相关:

格式

实例代码

注意:


事务的含义

在同一个事物下,一组sql 语句,要么成功,要么失败。不允许出现中间状态

举一个例子

张三给李四转200块。正常状态是张三扣钱,李四收到200块。但如果出现异常状况:

张三支付成功,李四没有收到/ 张三没有支付成功,但李四收到钱。这两种情况,在现实生活都不被允许的,因此如果出现异常情况,都会表示失败(在数据库中,会进行事务回滚,回到初始状态),只有都成功,才算结束。这个过程称为事务

事务的特征(面试高频)

原子性

只有当前事务结束了,才能进行下一个事物,不允许被打断。有点类似与多线程中的同步代码块

一致性

一个事务在执行前和执行后,数据库,都必须处以一致性状态

例如:比如张三向李四转钱这个过程,钱的总量是不变的(钱一直在流通,并且始终保持平衡状态)

隔离性

每一个都有各自完整的数据空间,即使多个事物,操作有同一个数据。各个事务之间,不受影响。(后面会有验证)

持久性

事务一旦提交,数据就会被永久的保留下来,即使出现各种异常,只要重新启动,就可以恢复到事务成功结束后的状态

事务结束

含义:事务提交(sql执行成功,执行事务提交 ,才结束)commit

注意:

  • mysql 默认 自动提交事务
  • 注意事务不允许重复提交

注意:mysql 自动提交事务

查看事务提交方式

事务提交方式有两种; 自动提交,手动提交

查看事务提交的变量值:on 自动提交 off 不是自动提交

show variables like 'autocommit’

通过set命令设置autocommit 全局变量的值,可以打开或关闭事物的自动提交

// 禁止事务自动提交
set autocommit=0;
// 开启事务自动提交
set autocommit=1;

注意:你关闭手动提交事务,只针对当前的窗口。如果你想永久的关闭自动提交,需要修改配置文件

打开命令行窗口,输入,关闭自动提交方式,改为手动 的sql 语句

实例

我现在 同时打开两个命令行A窗口 ,B窗口。并同时连接数据库,并在A窗口中 关闭自动提交 ,修改dj666数据库 user表的信息 。之后,会在两个窗口,中查看修改的数据,看是否会被修改

user表

1 在A窗口中 关闭自动提交 ,B窗口 修改dj666数据库 user表 中将第一行的用户名改为dj666

2  观察每张表是否被修改成功

3 发现B窗口中,数据没有被改变;A创建的数据发生改变。

两张表的数据之所以不一样的原因

我在A窗口中,将事务自动提交,关了。因此当修改数据时,不会直接在硬盘上修改。而是先将数据保存到内存中,在内存中修改数据,因此A窗口中查到的数据是还未被写入到硬盘上修改的数据。只有当我们手动提交事物成功后,才在硬盘上,修改完成。因此我们在B窗口中查到的数据,是还未被修改保存在硬盘上的数据

怎么处理呢?

输入

 commit ;

命令表示提交事务

A窗口执行该命令之后,再在B窗口中查询,发现B窗口的表的数据和A窗口的相同。表示事务提交成功

验证事务的隔离性

我首先在A窗口(自动提交,已经关了)修改用户 dj111的密码为111,再在B窗口(自动提交)中修改

事务回滚

含义:当程序中有些sql 执行成功了,有些执行失败了,会进行回滚操作,恢复到执行之前的状态)

rollback;

验证事务回滚

在A窗口中,我们未提交事务,相当于事物提交失败,因此当我们输入rollback 命令时,回到之前未操作状态

事务实现:是数据库提供

jdbc事务

注意:jdbc 默认自动提交

Connection的三个方法与事务相关:

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

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

commit():提交结束事务;con.commit();表示提交事务

rollback():回滚结束事务。con.rollback();表示回滚事务

格式

jdbc处理事务的代码格式:
try {
  con.setAutoCommit(false);//开启事务…
  ….
  …
  con.commit();//try的最后提交事务
} catch() {
  con.rollback();//回滚事务
}

实例代码

public void transfer(boolean b) {
		Connection con = null;
		PreparedStatement pstmt = null;
		
		try {
			con = JdbcUtils.getConnection();
			//手动提交
			con.setAutoCommit(false);
			String sql = "update account set balance=balance+? where id=?";
			pstmt = con.prepareStatement(sql);
			//操作
			pstmt.setDouble(1, -10000);
			pstmt.setInt(2, 1);
			pstmt.executeUpdate();
			
			// 在两个操作中抛出异常
			if(b) {
				throw new Exception();
			}
			pstmt.setDouble(1, 10000);
			pstmt.setInt(2, 2);
			pstmt.executeUpdate();
			
			//提交事务
			con.commit();
		} catch(Exception e) {
			//回滚事务
			if(con != null) {
				try {
					con.rollback();
				} catch(SQLException ex) {}
			}
			throw new RuntimeException(e);
		} finally {
			//关闭
			JdbcUtils.close(con, pstmt);
		}
	}

注意:

我们的jdbc默认是自动提交, 所以我们不需要手动提交了, 而且,==在实际开发中,我们的事务是加在业务层,而不是加在DAO层

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

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

相关文章

Python “文件和IO操作” ——Python面试100道实战题目练习,巩固知识、检查技术、成功就业

本文主要是作为Python中“文件和IO操作”的一些题目,方便学习完Python的函数之后进行一些知识检验,感兴趣的小伙伴可以试一试,含选择题、判断题、填空题。 在做题之前可以先学习或者温习一下Python的异常处理机制,推荐阅读下面这篇…

【Docker】自定义网络:实现容器之间通过域名相互通讯

文章目录 一. 默认网络:docker0网络的问题二. 自定义网络三. nginx容器指之间通过主机名进行内部通讯四. redis集群容器(跳过宿主机)内部网络通讯1. 集群描述2. 基于bitnami镜像的环境变量快速构建redis集群 一. 默认网络:docker0…

Kafka-Eagle的配置——kafka可视化界面

通过百度网盘分享的文件:kafka-eagle-bin-2.0.8.tar.gz 链接:https://pan.baidu.com/s/1H3YONkL97uXbLTPMZHrfdg?pwdsltu 提取码:sltu 一、界面展示 二、软件配置 1、关闭kafka集群 kf.sh stop 2、将该软件上传到/opt/modules下 cd /opt…

计算机图形学论文 | 木工设计与制造计划的共同优化

🦌🦌🦌读论文 我们的系统共同探索离散设计变量和制造计划的空间,以生成(设计,制造计划)对的帕累托前沿,使制造成本最小化。在该图中,(a)是椅子的输入设计和仅探索该设计的…

【百日算法计划】:每日一题,见证成长(023)

题目 每日温度 请根据每日气温列表,重新生成一个列表,对应的位置的输出为:要想观测到更高的气温,至少需要等待的天数.如果气温在这之后都不再升高,则该位置用0代替. 例如,给定一个列表[73, 74, 65, 80,] 你的输出应该是[1, 2, 1, 0] 思路 首先,我们先来画图分析一…

【在Linux世界中追寻伟大的One Piece】多路转接epoll

目录 1 -> I/O多路转接之poll 1.1 -> poll函数接口 1.2 -> poll的优点 1.3 -> poll的缺点 1.4 -> poll示例 1.4.1 -> 使用poll监控标准输入 2 -> I/O多路转接之epoll 2.1 -> 初识epoll 2.2 -> epoll的相关系统调用 2.2.1 -> epoll_cre…

推动AI云产业向深向实,云·AI·算力创新发展大会即将启幕

近年来,以AIGC为代表的新兴技术正加速演进,全球站在智能化变革的起点,人工智能与云计算的深度融合,也驱动云计算进入第三次发展浪潮,迎来前所未有的机遇。 伴随AI的快速发展,2024年《政府工作报告》明确提…

5G 现网信令参数学习(3) - RrcSetup(1)

目录 1. rlc-BearerToAddModList 1.1 rlc-Config 1.1.1 ul-AM-RLC 1.1.2 dl-AM-RLC 1.2 mac-LogicalChannelConfig 2. mac-CellGroupConfig 2.1 schedulingRequestConfig 2.2 bsr-Config 2.3 tag-Config 2.4 phr-Config 2.5 skipUplinkTxDynamic 3. physicalCellG…

【MyBatis源码】深入分析TypeHandler原理和源码

文章目录 原始 JDBC 存在的问题自定义 TypeHandler 实现TypeHandler详解BaseTypeHandler类TypeReference类型参考器43个类型处理器类型注册表:3个注解类枚举类 原始 JDBC 存在的问题 MyBatis 之所以设计了 TypeHandler(类型处理器)&#xff…

运营篇|公众号小程序如何实现流量主变现

公众号小程序如何实现流量主变现?三步走: ①开通流量主; ②接入广告; ③裂变传播; 一、小程序开通流量主的运营要求 微信小程序开通流量主的前提条件主要包括以下几个方面: 日活跃用户(DAU…

丹摩征文活动 | 轻松上手图像生成:FLUX.1遇上ComfyUI,让复杂变简单!

一、背景 FLUX.1是由黑森林实验室推出的一款前沿图像生成模型,针对不同用户需求,提供了三种不同版本。 FLUX.1-pro是专为企业设计的闭源版本,拥有无与伦比的性能和生成能力。其在识别提示词、提升视觉质量、细节表现及输出多样性方面都有出…

PyTorch核心概念:从梯度、计算图到连续性的全面解析(三)

文章目录 Contiguous vs Non-Contiguous TensorTensor and ViewStrides非连续数据结构:Transpose( )在 PyTorch 中检查Contiguous and Non-Contiguous将不连续张量(或视图)转换为连续张量view() 和 reshape() 之间的区别总结 参考文献 Contig…

「IDE」集成开发环境专栏目录大纲

✨博客主页何曾参静谧的博客📌文章专栏「IDE」集成开发环境📚全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定…

Kafka经典面试题

1、kafka消息发送的流程? producer发送过程中启动两个线程 一个main线程 一个sender线程,在main线程中先创建一个双端队列(RecordAccumlator、producerbatch),main将我们需要发送的东西经过拦截器,序列化&a…

手把手写深度学习(29):将DDP训练代码改成DeepSpeed

手把手写深度学习(0):专栏文章导航 前言:deepspeed已经成为了大模型时代训练模型的常规武器,这篇博客以一个基于DDP的 Stable Diffusion模型训练为例,讲解如何从将DDP训练代码改成DeepSpeed。 目录 构建optimizer 构建scheduler…

信息收集系列(二):ASN分析及域名收集

内容预览 ≧∀≦ゞ 信息收集系列(二):ASN分析及域名收集前言一、ASN 分析1. 获取 ASN 码2. 使用 ASNMap 获取 IP 范围3. 将 IP 范围转化为 IP 列表 二、关联域名收集1. 顶级域(TLD)收集测试方法 2. 根域名收集常用方法…

《数学分析》中不等式及补充

说明:此文章用于本人复习巩固,如果也能帮到大家那就更加有意义了。 注:1)《数学分析》中的不等式及不等式的补充

HTML之图片和超链接的学习记录

图片 在HTML中&#xff0c;我们可以使用img标签来显示一张图片。对于img标签&#xff0c;我们只需要掌握它的三个属性&#xff1a;src、alt和title。 <img src"" alt"" title"" /> src用于指定图片所在的路径&#xff0c;这个路径可以是…

unity显示获取 年月日周几【日期】

unity显示获取 年月日周几【日期】 public void ShowDate(Text txt){//txt.text DateTime now DateTime.Now; // 获取当前时间int year now.Year; // 获取年份int month now.Month; // 获取月份&#xff08;1-12&#xff09;int day now.Day; // 获取天数&#xff08;1-31&…

【区块链】深入理解智能合约 ABI

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 深入理解智能合约 ABI&#xff08;应用程序二进制接口&#xff09;一、ABI 基础…