MySQL笔记——数据库当中的事务以及Java实现对数据库进行增删改查操作

news/2024/5/20 20:24:34

系列文章目录

MySQL笔记——MySQL数据库介绍以及在Linux里面安装MySQL数据库,对MySQL数据库的简单操作,MySQL的外接应用程序使用说明

MySQL笔记——表的修改查询相关的命令操作

MySQL案例——多表查询以及嵌套查询

文章目录

系列文章目录

前言

一  数据库当中的事务

1.1 事务概念

1.2 事务的特性

1.3 事务控制语句

1.4 MYSQL 事务处理主要有两种方法

1.4.1 用 BEGIN, ROLLBACK, COMMIT来实现

1.4.2 直接用 SET 来改变 MySQL 的自动提交模式:

1.5 并发问题

1.6 隔离级别【了解即可】

 1.7 各种隔离级别中会出现的问题【了解即可】

1.8 事务回滚

1.9 补充

二 使用Java语言操作数据库curd

2.1 案例1——向账户表里面添加数据

2.2 向account账户表当中修改数据

2.3 向账户表当中删除数据

2.4 查询账户表当中的数据

总结


前言

本文主要介绍数据库当中的事务以及使用Java语言对数据库进行增删改查操作的代码演示

  • 当行单列——条件语句当中,使用运算符进行判断
  • 多行多列——in 集合
  • 多行多列——作为一个虚拟的表成为新的数据源

一  数据库当中的事务

1.1 事务概念

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

        所谓事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。例如,在关系数据库中,一个事务可以是一条SQL语句、一组SQL语句或整个程序。

        事务的开始与结束可以由用户显式控制。如果用户没有显式地定义事务,则由数据库管理系统按默认规定自动划分事务。 

  • 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
  • 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
  • 事务用来管理 insert,update,delete 语句

1.2 事务的特性

一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

  • 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

  • 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

  • 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

  • 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。

1.3 事务控制语句

  • BEGIN 或 START TRANSACTION 显式地开启一个事务;

  • COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;

  • ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;

  • SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;

  • RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;

  • ROLLBACK TO identifier 把事务回滚到标记点;

  • SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。

1.4 MYSQL 事务处理主要有两种方法

1.4.1 用 BEGIN, ROLLBACK, COMMIT来实现

  • BEGIN 开始一个事务
  • ROLLBACK 事务回滚
  • COMMIT 事务确认

1.4.2 直接用 SET 来改变 MySQL 的自动提交模式:

  • SET AUTOCOMMIT=0 禁止自动提交
  • SET AUTOCOMMIT=1 开启自动提交
SELECT @@autocommit

 

SQL语句当中,有的功能需要多个SQL语句实现就会使用到事务。

手动开启事务需要手动提交

1.5 并发问题

当高并发访问会遇到多个事务的隔离问题,可能会出现以下:

  1. 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
  2. 不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。
  3. 幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

1.6 隔离级别【了解即可】

系统默认隔离级别为3级,可能出现幻读的情况。

 1.7 各种隔离级别中会出现的问题【了解即可】

  • 读未提交( Read Uncommitted )
  • 读未提交是隔离级别最低的一种事务级别。在这种隔离级别下,一个事务会读到另一个事务更新后但未提交的数据,如果另一个事务回滚,那么当前事务读到的数据就是脏数据,这就是脏读(Dirty Read)。
  • 读已提交( Read Committed )
  • 在 Read Committed 隔离级别下,一个事务可能会遇到不可重复读(Non Repeatable Read)的问题。不可重复读是指,在一个事务内,多次读同一数据,在这个事务还没有结束时,如果另一个事务恰好修改了这个数据,那么,在第一个事务中,两次读取的数据就可能不一致。
  • 可重复读( Repeatable Read )
  • 在Repeatable Read隔离级别下,一个事务可能会遇到幻读(Phantom Read)的问题。幻读是指,在一个事务中,第一次查询某条记录,发现没有,但是,当试图更新这条不存在的记录时,竟然能成功,并且,再次读取同一条记录,它就神奇地出现了。幻读就是没有读到的记录,以为不存在,但其实是可以更新成功的,并且,更新成功后,再次读取,就出现了。
  • 可串行化( Serializable )
  • Serializable 是最严格的隔离级别。在Serializable隔离级别下,所有事务按照次序依次执行,因此,脏读、不可重复读、幻读都不会出现。
  • 虽然 Serializable 隔离级别下的事务具有最高的安全性,但是,由于事务是串行执行,所以效率会大大下降,应用程序的性能会急剧降低。如果没有特别重要的情景,一般都不会使用Serializable隔离级别。

默认隔离级别:如果没有指定隔离级别,数据库就会使用默认的隔离级别。在MySQL中,如果使用 InnoDB,默认的隔离级别是Repeatable Read。 

1.8 事务回滚

1.9 补充

查询全局事务隔离级别

show global variables like '%isolation%';SELECT @@global.tx_isolation;

MySQL默认事务的隔离级别

 

二 使用Java语言操作数据库curd

2.1 案例1——向账户表里面添加数据

package com.lanzhou.acountdemo;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;public class AcountDemo {public static void main(String[] args) throws Exception{insert();}//定义一个方法,增加数据的方法public static void insert() throws Exception{//编写java语言来操作账户表//2、导入jar包--数据库驱动包。mysql-connector-java-5.1.37-bin.jar//导入数据库驱动, add build path//3、加载数据库驱动Class.forName("com.mysql.jdbc.Driver");//4、创建java语言环境数据库的连接对象 connectionConnection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db04",//此处填写你自己的IP地址"root","root");//5、创建执行sql语句的对象 statementStatement statement = connection.createStatement();//6、发送给数据库执行sql语句 调用相关的方法int i = statement.executeUpdate("insert into account (name,balance) values('ww',1000)");//7、返回结果,结果处理 在控制台中结果System.out.println("输出i的值"+i);//8、资源释放statement.close();connection.close();}}

2.2 向account账户表当中修改数据

package com.lanzhou.acountdemo;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;public class AcountDemo {public static void main(String[] args) throws Exception{update();}//定义一个方法,修改数据public static void update() throws Exception{//步骤//3、加载数据库驱动Class.forName("com.mysql.jdbc.Driver");//4、创建java语言环境数据库的连接对象 connectionConnection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db04",//此处填写你自己的IP地址"root", "root");//5、创建执行sql语句的对象 statementStatement statement = connection.createStatement();//、发送给数据库执行sql语句 调用相关的方法 excuteupdate 执行的sql是 增加,修改,删除的sqlint i = statement.executeUpdate("update account set balance = 2000 where id=3");//7、返回结果,结果处理 在控制台中结果System.out.println("受影响的行数:"+i);// 8、资源释放statement.close();connection.close();}}

2.3 向账户表当中删除数据

package com.lanzhou.acountdemo;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;public class AcountDemo {public static void main(String[] args) throws Exception{delete();}//定义一个方法,删除数据 id=3public static void delete() throws Exception{//步骤//3、加载数据库驱动Class.forName("com.mysql.jdbc.Driver");//4、创建java语言环境数据库的连接对象 connectionConnection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db04",//此处填写你自己的IP地址"root", "root");//5、创建执行sql语句的对象 statementStatement statement = connection.createStatement();//、发送给数据库执行sql语句 调用相关的方法 excuteupdate 执行的sql是 增加,修改,删除的sqlint i = statement.executeUpdate("delete from account where id=3");//7、返回结果,结果处理 在控制台中结果System.out.println("受影响的行数:"+i);// 8、资源释放statement.close();connection.close();}
}

2.4 查询账户表当中的数据

package com.lanzhou.acountdemo;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;public class AcountDemo {public static void main(String[] args) throws Exception{select();}//定义一个方法,查询账户表的全部数据public static void select() throws Exception{//步骤//3、加载数据库驱动Class.forName("com.mysql.jdbc.Driver");//4、创建java语言环境数据库的连接对象 connectionConnection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db04",//此处填写你自己的IP地址"root", "root");//5、创建执行sql语句的对象 statementStatement statement = connection.createStatement();//6、执行sql语句 查询语句 获取到结果集合ResultSet resultSet = statement.executeQuery("select * from account");//7、遍历集合,先判断和这个集合中是否有数据while(resultSet.next()){ //判断集合中的第一条是否有数据,返回true表示有数据int id =  resultSet.getInt(1);String name =resultSet.getString(2);double balance = resultSet.getDouble(3);System.out.println("id的值:"+id+"账号:"+name+"金额:"+balance);}// resultset.next 返回flase while循环跳出//7 资源释放resultSet.close();statement.close();connection.close();}
}

案例仅作为参考来讲,在实际的开发环境当中对于数据库的插入更新等等操作并不能写的太死。

总结

以上就是今天的内容~

欢迎大家点赞👍,收藏⭐,转发🚀,
如有问题、建议,请您在评论区留言💬哦。

最后:转载请注明出处!!!


http://www.mrgr.cn/p/17753861

相关文章

Python Web 开发及 Django 总结

title: Python Web 开发及 Django 总结 date: 2023-07-24 17:26:26 tags: PythonWeb categories:Python cover: https://cover.png feature: false Python 基础部分见:Python 基础总结 1. 创建项目 1.1 命令行 1、下载安装 Django 在终端输入 pip install djan…

SOLIDWORKS Electrical解决三大常见问题

图纸关联的地方太多,低级错误总是规避不完?设计好的电气图到了现场却总是装不好?机械电气多个团队并行工作,沟通不畅一团乱麻?规避错误准确出图、提前布局工艺配装、有效加强团队协作,了解达索系统SOLIDWORKS Electrical更多高效应用场景。…

用html+javascript打造公文一键排版系统8:附件及标题排版

最近工作有点忙,所 以没能及时完善公文一键排版系统,现在只好熬夜更新一下。 有时公文有包括附件,招照公文排版规范: 附件应当另面编排,并在版记之前,与公文正文一起装订。“附件”二字及附件顺序号用3号黑…

PHP: 开发入门macOS系统下的安装和配置

安装Homebrew 安装 ~~友情提示:这个命令对网络有要求,可能需要翻墙或者用你的手机热点试试,或者把DNS换成(114.114.114.114 和 8.8.8.8) /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebr…

使用 monaco-editor-nls 汉化 右键菜单汉化部分失败原因

首先使用npm或者其他包管理工具安装依赖插件: npm install monaco-editor --save npm install monaco-editor-nls --save npm install monaco-editor-webpack-plugin --save npm install monaco-editor-esm-webpack-plugin --save-dev如果右键菜单汉化一部分失败&a…

Day49 算法记录|动态规划16 (子序列)

这里写目录标题 583. 两个字符串的删除操作72. 编辑距离总结 583. 两个字符串的删除操作 这道题求得的最小步数,是这道题的变种 M i n ( 步数) s t r 1. l e n g t h s t r 2. l e n g t h − 2 ∗ ( M a x ( 公共字符串长度) ) Min(步数…

《TCP IP网络编程》第十四章

第 14 章 多播与广播 14.1 多播 多播(Multicast)方式的数据传输是基于 UDP 完成的。因此 ,与 UDP 服务器端/客户端的实现方式非常接近。区别在于,UDP 数据传输以单一目标进行,而多播数据同时传递到加入(注…

C语言第十三课--------初阶指针的认识--------重要部分

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂…

MobaXterm通过SSH访问Ubuntu服务器遇到的一个问题

在Windows下的MobaXterm界面配置完ubuntuIP以后显示access denied,排查发现是因为在ubuntu那边忘记安装了SSH Serve,安装过程如下: 第一步:安装所需包 让我们从打开终端输入一些必要命令开始。 注意,在安装新的包或…

java+springboot+mysql智慧办公OA管理系统

项目介绍: 使用javaspringbootmysql开发的智慧办公OA管理系统,系统包含超级管理员,系统管理员、员工角色,功能如下: 超级管理员:管理员管理;部门管理;职位管理;员工管理…

hive 全量表、增量表、快照表、切片表和拉链表

全量表:记录每天的所有的最新状态的数据,增量表:记录每天的新增数据,增量数据是上次导出之后的新数据。快照表:按日分区,记录截止数据日期的全量数据切片表:切片表根据基础表,往往只…

41. linux通过yum安装postgresql

文章目录 1.下载安装包2.关闭内置PostgreSQL模块:3.安装postgresql服务:4.初始化postgresql数据库:5.设置开机自启动:6.启动postgresql数据库7.查看postgresql进程8.通过netstat命令或者lsof 监听默认端口54329.使用find命令查找了一下postgresql.conf的配置位置10.修改postgre…

Linux安装MySQL 8.1.0

MySQL是一个流行的开源关系型数据库管理系统,本教程将向您展示如何在Linux系统上安装MySQL 8.1.0版本。请按照以下步骤进行操作: 1. 下载MySQL安装包 首先,从MySQL官方网站或镜像站点下载MySQL 8.1.0的压缩包mysql-8.1.0-linux-glibc2.28-x…

数据结构-链表结构-单向链表

链表结构 说到链表结构就不得不提起数据结构,什么是数据结构?就是用来组织和存储数据的某种结构。那么到底是某种结构呢? 数据结构分为: 线性结构 数组,链表,栈,队列 树形结构 二叉树&#x…

NO1.使用命令行创建Maven工程

①在工作空间目录下打开命令窗口 ②使用命令行生成Maven工程 mvn archetype:generate 运行 MVN 原型:生成命令,下面根据提示操作 选择一个数字或应用过滤器(格式:[groupId:]artifactId,区分大小写包含)&a…

HTML基础知识点总结

目录 1.HTML简介 2.HTML基础结构 主要字符: 3.基础知识 (一)p标签 (二)hr标签 (三)尖角号 (四)版权号 (五)div和span div span (六)列表 (1&…

11-3_Qt 5.9 C++开发指南_QSqlQuery的使用(QSqlQuery 是能执行任意 SQL 语句的类)

文章目录 1. QSqlQuery基本用法2. QSqlQueryModel和QSqlQuery联合使用2.1 可视化UI设计框架2.1.1主窗口的可视化UI设计框架2.1.2 对话框的可视化UI设计框架 2.2 数据表显示2.3 编辑记录对话框2.4 编辑记录2.5 插入记录2.6 删除记录2.7 记录遍历2.8 程序框架及源码2.8.1 程序整体…

【SpringCloud Alibaba】(六)使用 Sentinel 实现服务限流与容错

今天,我们就使用 Sentinel 实现接口的限流,并使用 Feign 整合 Sentinel 实现服务容错的功能,让我们体验下微服务使用了服务容错功能的效果。 因为内容仅仅围绕着 SpringCloud Alibaba技术栈展开,所以,这里我们使用的服…

【MySQL】复合查询

目录 一、基本查询 1、查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J 2、按照部门号升序而雇员的工资降序排序 3、使用年薪进行降序排序 4、显示工资最高的员工的名字和工作岗位 5、显示工资高于平均工资的员工信息 6、显示每…

容灾独家技术揭秘:HyperBDR无主机数据同步技术

01、一对一单机热备-传统灾备方式 单机热备是一种备份解决方案,它使用两台服务器来确保高可用性,是市场上最为常见的灾备模式。 在单机热备中,一台主服务器和一台备用服务器保持同步,以确保在主服务器出现故障或宕机时可以立即切换…