数据库事务以及JDBC实现事务

一、数据库事务

数据库事务(Database Transaction)是数据库管理系统中的一个核心概念,它代表一组操作的集合,这些操作要么全部执行成功,要么全部不执行,即操作数据的最小执行单元,保证数据库的数据一致性、完整性和可靠性。

一条数据库语句也是事务。

1、事务的ACID特性

1.原子性(Atomicity)

定义:事务中的操作要么全部完成,要么全部不做。

类比:就像你去银行进行转账操作,银行要么把钱从你账户转到对方账户,要么不做任何改变。如果途中出错,转账的整个过程会被“撤销”,就像根本没有进行过转账一样。

2.一致性(Consistency)

定义:事务开始之前和结束之后,数据库必须保持一致的状态。事务的执行不能破坏数据库的规则(如约束、触发器等)。

类比:银行的转账必须符合规则,比如账户的余额不能为负。即使你操作了很多次,只要操作成功,每次操作之后的账户余额都应该是合法的。

3.隔离性(Isolation)

定义:事务执行的过程中,其它事务不能看到中间的结果,直到事务完全提交。

类比:假设你和另一个人在银行同时转账,你的转账操作在完成前不会对对方的转账产生任何影响。如果没有隔离性,两个操作可能会影响对方的账户余额。

4.持久性(Durability)

定义:一旦事务提交,数据的修改是永久性的,即使系统崩溃,也不会丢失。

类比:转账一旦完成,银行系统保证这笔转账数据会被保留下来,哪怕系统发生故障,数据依然能够恢复。

2、事务的典型示例

假设你要从账户A转账100元到账户B,整个过程可能包括以下几个操作:

从账户A扣款100元

向账户B存款100元

如果这两个操作都成功完成,转账就完成了。但如果在第一个操作完成后,第二个操作失败了(比如系统崩溃),那么账户A的100元已经被扣除了,但是账户B并没有收到这100元。这种情况是不符合“原子性”的。

为了解决这个问题,数据库使用事务来确保:

原子性:要么两个操作都执行成功(100元从A扣除,B收到100元),要么两个操作都不执行(账户A和账户B保持原状)。

一致性:如果转账开始前的数据库状态是合法的(如余额不为负),那么转账完成后,数据库状态依然是合法的(A账户不会有负数,B账户的余额增加了100元)。

隔离性:在你完成转账前,别人无法看到你的转账结果,确保数据不会受到并发操作的影响。

持久性:一旦你提交了转账,无论系统发生什么故障,转账的数据都会保存下来。

3、MySQL客户端演示事务

1.准备数据集

建表:

CREATE TABLE t_account ( 
id INT PRIMARY KEY auto_increment, 
username VARCHAR ( 20 ), 
money DOUBLE 
);

插入测试数据:

INSERT INTO account
VALUES( 1, '美美', 10000 );
INSERT INTO account
VALUES( 2, '冠希', 10000 );
INSERT INTO account
VALUES( 3, '小凤', 10000 );
INSERT INTO account
VALUES( 4, '熊大', 10000 );
INSERT INTO account
VALUES( 5, '熊二', 10000 );

数据集准备完成。

2.实现事务的两种方式

(1)使用start transaction命令

熊大给小凤转账1000块

此时还未提交或者回滚,表明事务还没结束。如果此时发生异常,两个账户中的money会回到事务开启前的状态。

进行回滚

看到数据库是回到的事物开启前的状态。

此时进行了提交,看到数据库中数据已被改变

(2)设置MySQL事务默认不提交

MySQL数据库的事务是默认提交的

单独执行

 update account set money=money-1000 where username ="熊大";

MySQL将这视为一个事务,并默认提交

使用命令

set autocommit = off;

set autocommit = 0;

取消MySQL的默认提交事务

如果不手动提交事务或回滚事务,数据库中数据不做修改。

二、JDBC实现事务

JDBC实现事务只需要关闭MySQL的自动提交,并实现手动提交,即

// 关闭自动提交
conn.setAutoCommit(false);
// 手动提交事务
conn.commit();

当前数据库信息:

模拟转账Java操作数据库:

package com.goose;import com.goose.utils.JDBCUtils;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;/*** @Author: Goose* @Description: TODO* @Date: 2025/5/11 11:19* @Version: 1.0*/public class JDBCShiWu {public static void main(String[] args) {Connection conn = JDBCUtils.getConnection();Statement stmt = null;try {// 关闭自动提交conn.setAutoCommit(false);stmt = conn.createStatement();String sql1 = "UPDATE account SET money = money - 1000 WHERE username = '熊大'";String sql2 = "UPDATE account SET money = money + 1000 WHERE username = '小凤'";int i = stmt.executeUpdate(sql1);// int a = 10/0;int i2 = stmt.executeUpdate(sql2);System.out.println("i = "+i+", i2 = "+ i2);// 手动提交事务// conn.commit();} catch (SQLException e) {e.printStackTrace();}finally{JDBCUtils.close(conn,stmt);}}
}

执行结果:

关闭自动提交后,不进行手动提交数据库信息不发生变化。

开启手动提交,数据库才能完成转账业务实现。

开启事务后,如果在执行SQL时发生异常,也不会提交事务

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

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

相关文章

【vue】【环境配置】项目无法npm run serve,显示node版本过低

解决方案:安装高版本node,并且启用高版本node 步骤: 1、查看当前版本 node -v2、配置nvm下载镜像源 1)查看配置文件位置 npm root2)找到settings.txt文件 修改镜像源为: node_mirror: https://npmmirro…

WPF之INotifyPropertyChanged实现

文章目录 引言INotifyPropertyChanged接口基础接口定义工作原理 基本实现方式标准实现示例CallerMemberName特性 高级实现技术基类实现通知多个属性变化使用PropertyChanging事件 MVVM框架中的实现MVVM模式简介MVVM框架中的实现Prism框架MVVM Light框架自定义MVVM基类 性能优化…

【MCP教程系列】SpringBoot 搭建基于 Spring AI 的 SSE 模式 MCP 服务

原文地址:https://developer.aliyun.com/article/1662946 在当今快速发展的AI技术背景下,如何高效地集成模型能力成为开发者关注的重点。本文将手把手教你如何基于 Spring AI 搭建支持 SSE(Server-Sent Events)模式的 MCP 服务 相…

springboot集成langchain4j实现票务助手实战

前言 看此篇的前置知识为langchain4j整合springboot,以及springboot集成langchain4j记忆对话。 Function-Calls介绍 langchain4j 中的 Function Calls(函数调用)是一种让大语言模型(LLM)与外部工具(如 A…

MySQL-数据库分布式XA事务

准备 innodb存储引擎开启支持分布式事务 set global innodb_support_axonMySQL数据库XA事务的SQL语法如下: XA {START| BEGIN} xid {JOIN | RESUME} XA END xid {SUSPEND [ FOR MIGRATE]} XA PREPARE xid XA COMMIT xid [ONE PHASE] XA ROLLBACK xid XA RECOVER 完…

SAP 运维-冷门问题解决办法

1.SAP Fiori帮助菜单链接如何配置? 答: 执行事务代码HELP_CONFIG,选择对应的Fiori部署模式,配置帮助菜单下的URL链接。 检查配置的帮助菜单,执行事务代码/N//UI2/FLP_CUS_CONF 或者SR13进行查看配置状态与修改。

新型智慧园区技术架构深度解析:数字孪生与零碳科技的融合实践

🏭在杭州亚运村零碳园区,光伏板与氢燃料大巴构成的能源网络,正通过数字孪生技术实现智能调度。这不仅是格力电器与龙源电力在新能源领域的创新实践,更是智慧园区4.0时代的标杆案例。当AI算法开始接管能源调度,当BIM建模…

Java转Go日记(三十六):简单的分布式

1.1.1. 简单的分布式server 目前分布式系统已经很流行了,一些开源框架也被广泛应用,如dubbo、Motan等。对于一个分布式服务,最基本的一项功能就是服务的注册和发现,而利用zk的EPHEMERAL节点则可以很方便的实现该功能。EPHEMERAL节…

机器学习笔记——特征工程

大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本笔记介绍机器学习中常见的特征工程方法、正则化方法和简要介绍强化学习。 文章目录 特征工程(Fzeature Engineering)1. 特征提取&#xff…

在 Ubuntu 20.04.6 LTS 中将 SCons 从 3.1.2 升级到 4.9.1

在 Ubuntu 20.04.6 LTS 中将 SCons 从 3.1.2 升级到 4.9.1,可以通过以下步骤完成: 方法 1:使用 pip 安装(推荐) 步骤 1:卸载旧版本 SCons # 如果通过 apt 安装的旧版本,先卸载 sudo apt remov…

LeetCode热题100--234.回文链表--简单

1. 题目 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true 示例 2: 输入&#xf…

【markdown】介绍如何在markdown中绘制流程图

在 Markdown 中编写流程图主要通过 ​​Mermaid 语法​​实现(多数平台如 GitHub、VS Code、Typora 已原生支持)。以下是详细方法: 1. 基础流程图​​ 语法结构 用 mermaid 包裹代码块,指定方向后定义节点和连接线&#xff1a…

Java中使用自定义序列化器:自动添加View字段的实现与应用

Java 中 BigDecimal 序列化器:自动添加 View 返回字段的实现与应用 在 Java 开发过程中,数据的序列化与反序列化是非常重要的环节。当我们处理数值类型数据,特别是BigDecimal类型时,有时需要在序列化输出中添加额外的视图字段,以满足前端展示或者特定业务需求。本文将通过…

Java类一文分解:JavaBean,工具类,测试类的深度剖析

解锁Java类的神秘面纱:从JavaBean到测试类的深度剖析 前言一、JavaBean 类:数据的守护者(一)JavaBean 类是什么(二)JavaBean 类的特征(三)JavaBean 类的使用场景(四&…

机器学习-- 线性回归、逻辑回归

线性回归 线性回归是一种统计方法,用于发现变量之间的关系。在机器学习背景下,线性回归可找出特征(Feature)与标签(Lable)之间的关系。 例如,假设我们想要根据汽车的重量预测汽车的每加仑汽油行驶里程(mpg),并且我们有以下数据集: 线性回归方程 Linear regressi…

Lua再学习

因为实习的项目用到了Lua,所以再来深入学习一下 函数 函数的的多返回值 Lua中的函数可以实现多返回值,实现方法是再return后列出要返回的值的列表,返回值也可以通过变量接收到,变量不够也不会影响接收对应位置的返回值 Lua中传…

TCP协议十大核心特性深度解析:构建可靠传输的基石

TCP(传输控制协议)作为互联网的"交通指挥官",承载着全球80%以上的网络流量。本文将深入解析TCP协议的十大核心特性,通过原理剖析、流程图解和实战案例,揭示其如何实现高效可靠的数据传输。 一、面向连接的可…

基于 Spring Boot 瑞吉外卖系统开发(十三)

基于 Spring Boot 瑞吉外卖系统开发(十三) 查询套餐 在查询套餐信息时包含套餐的分类名,分类名称在category表中,因此这里需要进行两表关联查询。 自定义SQL如下: select s.* ,c.name as category_name from setmeal…

华为IP(6)

VLAN聚合 VLAN聚合产生的技术背景 在一般是三层交换机中,通常采用一个VLAN接口的方式实现广播域之间的互通,这在某些情况下导致了IP地址的浪费 因为一个VLAN对应的子网中,子网号、子网广播地址、子网网关地址不能用作VLAN内的主机IP地址&a…

深度解析IP静态的工作原理,IP静态的应用场景又哪些?

一、什么是IP静态? 当我们谈到“IP静态”时,大家可能首先想到的是与“动态IP”相对的概念。确实如此,静态IP是一种固定分配的IP地址,也就是说,在特定时间内,分配给你的IP地址不会有所更改——无论你完成多…