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

🏆🏆🏆教程全知识点简介: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)是一种机制、一个操作序列,包含了==一组数据库操作命令==。
事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令==要么同时成功,要么同时失败==。
事务是一个不可分割的工作逻辑单元。
这些概念不好理解,接下来举例说明,如下图有一张表
张三和李四账户中各有100块钱,现李四需要转换500块钱给张三,具体的转账操作为
- 第一步:查询李四账户余额
- 第二步:从李四账户金额 -500
- 第三步:给张三账户金额 +500
现在假设在转账过程中第二步完成后出现了异常第三步没有执行,就会造成李四账户金额少了500,而张三金额并没有多500;这样的系统是有问题的。如果解决呢?使用事务可以解决上述问题
从上图可以看到在转账前开启事务,如果出现了异常回滚事务,三步正常执行就提交事务,这样就可以完美解决问题。
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。
- 添加事务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;
某瓣音乐
分析
音乐专辑表名: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 | 编号(唯一) |
评论表名: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 | 用户编号(主键) |
表关系:
🚀✨ (未完待续)项目系列下一章
📚下一篇 将进入更精彩的环节! 🔔 记得收藏 & 关注,第一时间获取更新! 🍅 一起见证整个系列逐步成型的全过程。
- 点赞
- 收藏
- 关注作者
评论(0)