【Java开发】嘿马JavaWeb全技术开发第6篇:4,事务【附代码文档】

举报
小帅说java 发表于 2025/09/09 14:18:25 2025/09/09
【摘要】 MySQL基础 1,数据库相关概念 2,MySQL 3,SQL概述 4,DDL:操作数据库 6,navicat使用 7,DML mysql高级 1,约束 2,数据库设计 创建部门表 4,事务 JDBC 1,JDBC概述 2,JDBC快速入门 3,JDBC API详解 4,数据库连接池 Getting Started Mybatis练习 1,配置文件实现CRUD HTML&CSS

🏆🏆🏆教程全知识点简介:MySQL基础 1,数据库相关概念 2,MySQL 3,SQL概述 4,DDL:操作数据库 6,navicat使用 7,DML mysql高级 1,约束 2,数据库设计 创建部门表 4,事务 JDBC 1,JDBC概述 2,JDBC快速入门 3,JDBC API详解 4,数据库连接池 Getting Started Mybatis练习 1,配置文件实现CRUD HTML&CSS 1,HTML 2,CSS JavaScript 5,BOM 9,RegExp对象 HTTP&Tomcat&Servlet 1,Web概述 2, HTTP 3, Tomcat 4, Servlet 一、状态码大类 二、常见的响应状态码 Contributing to Apache Tomcat Code of Conduct How Can I Contribute? 1,Request和Response的概述 2,Request对象 JSP 3,JSP 原理 5,EL 表达式 6,JSTL标签 会话技术 1,会话跟踪技术的概述 2,Cookie 3,Session 4,用户登录注册案例 Filter&Listener&Ajax 1,Filter 2,Listener 3,Ajax 4,axios 5,JSON 6,案例 VUE&Element 1,VUE 3,综合案例 1,功能介绍 2,环境准备 3,查询所有功能 4,添加功能 6,批量删除 7,分页查询


📚📚👉👉👉本站这篇博客:   https://bbs.huaweicloud.com/blogs/459780    中查看

📚📚👉👉👉本站这篇博客:   https://bbs.huaweicloud.com/blogs/459780    中查看

📚📚👉👉👉本站这篇博客:   https://bbs.huaweicloud.com/blogs/459780    中查看

✨ 本教程项目亮点

🧠 知识体系完整:覆盖从基础原理、核心方法到高阶应用的全流程内容
💻 全技术链覆盖:完整前后端技术栈,涵盖开发必备技能
🚀 从零到实战:适合 0 基础入门到提升,循序渐进掌握核心能力
📚 丰富文档与代码示例:涵盖多种场景,可运行、可复用
🛠 工作与学习双参考:不仅适合系统化学习,更可作为日常开发中的查阅手册
🧩 模块化知识结构:按知识点分章节,便于快速定位和复习
📈 长期可用的技术积累:不止一次学习,而是能伴随工作与项目长期参考


🎯🎯🎯全教程总章节


🚀🚀🚀本篇主要内容

4,事务

4.1 概述

数据库的事务(Transaction)是一种机制、一个操作序列,包含了==一组数据库操作命令==。

事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令==要么同时成功,要么同时失败==。

事务是一个不可分割的工作逻辑单元。

这些概念不好理解,接下来举例说明,如下图有一张表

image-20210724224955876

张三和李四账户中各有100块钱,现李四需要转换500块钱给张三,具体的转账操作为

  • 第一步:查询李四账户余额
  • 第二步:从李四账户金额 -500
  • 第三步:给张三账户金额 +500

现在假设在转账过程中第二步完成后出现了异常第三步没有执行,就会造成李四账户金额少了500,而张三金额并没有多500;这样的系统是有问题的。如果解决呢?使用事务可以解决上述问题

image-20210724225537533

从上图可以看到在转账前开启事务,如果出现了异常回滚事务,三步正常执行就提交事务,这样就可以完美解决问题。

4.2 语法

  • 开启事务
  START TRANSACTION;
  或者  
  BEGIN;
  • 提交事务
  commit;
  • 回滚事务
  rollback;

4.3 代码验证

  • 环境准备
  DROP TABLE IF EXISTS account;

  -- 创建账户表
  CREATE TABLE account(
    id int PRIMARY KEY auto_increment,
    name varchar(10),
    money double(10,2)
  );

  -- 添加数据
  INSERT INTO account(name,money) values('张三',1000),('李四',1000);
  • 不加事务演示问题
  -- 转账操作
  -- 1. 查询李四账户金额是否大于500

  -- 2. 李四账户 -500
  UPDATE account set money = money - 500 where name = '李四';

  出现异常了...  -- 此处不是注释,在整体执行时会出问题,后面的sql则不执行
  -- 3. 张三账户 +500
  UPDATE account set money = money + 500 where name = '张三';

整体执行结果肯定会出问题, 查询账户表中数据,发现李四账户少了500。

image-20210724230250263

  • 添加事务sql如下:
  -- 开启事务
  BEGIN;
  -- 转账操作
  -- 1. 查询李四账户金额是否大于500

  -- 2. 李四账户 -500
  UPDATE account set money = money - 500 where name = '李四';

  出现异常了...  -- 此处不是注释,在整体执行时会出问题,后面的sql则不执行
  -- 3. 张三账户 +500
  UPDATE account set money = money + 500 where name = '张三';

  -- 提交事务
  COMMIT;

  -- 回滚事务
  ROLLBACK;

上面sql中的执行成功进选择执行提交事务,而出现问题则执行回滚事务的语句。以后 肯定不可能这样操作,而是在java中进行操作,在java中可以抓取异常,没出现异常提交事务,出现异常回滚事务。

4.4 事务的四大特征

  • 原子性(Atomicity): 事务是不可分割的最小操作单位,要么同时成功,要么同时失败

  • 一致性(Consistency) :事务完成时,必须使所有的数据都保持一致状态

  • 隔离性(Isolation) :多个事务之间,操作的可见性

  • 持久性(Durability) :事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

==说明:==

mysql中事务是自动提交的。

也就是说 不添加事务执行sql语句,语句执行完毕会自动的提交事务。

可以通过下面语句查询默认提交方式:

java SELECT @@autocommit;

查询到的结果是1 则表示自动提交,结果是0表示手动提交。当然也可以通过下面语句修改提交方式

sql set @@autocommit = 0;

某瓣音乐

image-20210415153936570

分析

音乐专辑表名:Music

字段名 数据类型 说明
title varchar(32) 专辑名

[IntelliJ IDEA 文档]

| alias | varchar(32) | 专辑别名 |

[Retrofit 文档]

| image | varchar(64) | 封面图片 |

[Error Prone 文档]

[Spock 框架]

| style | varchar(8) | 流派(如经典、流行、民谣、电子等) | | type | varchar(4) | 类型(专辑、单曲等) | | medium | varchar(4) | 介质(CD、黑胶、数字等) | | publish_time | date | 发行时间 |

[Cucumber Java 文档]

| publisher | varchar(16) | 出版者 | | number | tinyint | 唱片数 | | barcode | bigint | 条形码 | | summary | varchar(1024) | 简介 | | artist | varchar(16) | 艺术家 | | id | int | 编号(唯一) |

曲目表名: Song

字段名 数据类型 说明
name varchar(32) 歌曲名
serial_number tinyint 歌曲序号

[Spring Security 文档]

| id | int | 编号(唯一) |

image-20210415162150858

评论表名:Review

字段名 数据类型 说明
content varchar(256) 评论内容
rating tinyint 评分(1~5)
review_time datetime 评论时间

用户表名:User

字段名 数据类型 说明
username varchar(16) 用户名(唯一)
image varchar(64) 用户头像图片地址
signature varchar(64) 个人签名,例如(万般各所是 一切皆圆满)
nickname varchar(16) 用户昵称
id int 用户编号(主键)

表关系:


🚀✨ (未完待续)项目系列下一章

📚下一篇 将进入更精彩的环节! 🔔 记得收藏 & 关注,第一时间获取更新! 🍅 一起见证整个系列逐步成型的全过程。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。