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

news2024/11/17 17:48:21

系列文章目录

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语言环境数据库的连接对象 connection
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db04",//此处填写你自己的IP地址
                "root",
                "root");
        //5、创建执行sql语句的对象 statement
        Statement 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语言环境数据库的连接对象 connection
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db04",//此处填写你自己的IP地址
                "root", "root");
        //5、创建执行sql语句的对象 statement
        Statement statement = connection.createStatement();
        //、发送给数据库执行sql语句 调用相关的方法 excuteupdate 执行的sql是 增加,修改,删除的sql

        int 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=3
    public static void delete() throws Exception{
        //步骤
        //3、加载数据库驱动
        Class.forName("com.mysql.jdbc.Driver");

        //4、创建java语言环境数据库的连接对象 connection
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db04",//此处填写你自己的IP地址
                "root", "root");
        //5、创建执行sql语句的对象 statement
        Statement statement = connection.createStatement();
        //、发送给数据库执行sql语句 调用相关的方法 excuteupdate 执行的sql是 增加,修改,删除的sql

        int 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语言环境数据库的连接对象 connection
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db04",//此处填写你自己的IP地址
                "root", "root");
        //5、创建执行sql语句的对象 statement
        Statement 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.coloradmin.cn/o/803374.html

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

相关文章

OpenLayers入门,html原生网页如何使用OpenLayers地图

专栏目录: OpenLayers入门教程汇总目录 前言 尽管现在大部分网页都是使用vue或者react开发了,但是还是有不少开发者使用的是网页原生html进行开发,或者是老项目维护的需要,所以为了照顾使用html原生网页的同学们,本章简单讲解一下如何使用原始html网页情况下使用OpenLay…

网站服务器出错的原因分析和解决方法

​  网站在日常运行的过程中,难免会遇见一些问题,这次我们就来分析关于网站服务器出错、服务器异常的原因以及如何解决网站服务器错误的方法。 如何知道是网站服务器的问题呢? 只要网站不能正常访问运行,那么一定会反馈相关的错误代码和原…

Ubuntu18.04下编译qgc源码

写在前面 在下载前必须说明,根据你的qgc源码版本进行下载,有的源码必须要求Qt是5.15版本以上。 个人所使用开发软件 版本QT5.12.9qgc源码V4.0Ubuntu18.04 QT下载 (1)我们可以去官网下载官网下载地址具体的下载方法这里不用多说&a…

【Docker 学习笔记】Docker架构及三要素

文章目录 一、Docker 简介二、Docker 架构1. Docker 客户端和服务器2. Docker 架构图3. Docker 运行流程图 三、Docker 三要素1. 镜像(Image)2. 容器(Container)3. 仓库(Repository) 一、Docker 简介 Dock…

【100天精通python】Day19:python文件及目录操作_基本文件操作

目录 专栏导读 1 文件的创建打开和关闭 2.1 使用内置函数open(),close()创建打开和关闭 2.2 使用with语句打开和关闭 2 文件的读取 2.1 读取整个文件read() 2.2 逐行读取文件内容readlines() 3 文件的写入 3.1 直接写入 3.2 写入整个文件 3.3 逐行写入文件 4 文件…

SAP 密码管理(自动登录)

前提: Office excel版本2013及更高版本 SAP系统启用GUI脚本 RZ11: 参数sapgui/user_scripting 修改为 TRUE 一:安装Excel插件,并维护登陆信息 二:登陆系统 插件下载链接: (185条消息) SAP密码管理excle插件资源-C…

windows下使用pytorch进行单机多卡分布式训练

首先,pytorch的版本必须是大于1.7,这里使用的环境是: pytorch1.12cu11.6 四张4090显卡 python3.7.6使用nn.DataParallel进行分布式训练 这一种方式较为简单: 首先我们要定义好使用的GPU的编号,GPU按顺序依次为0,1,2,3…

微信小程序nodejs+vue房屋租赁交易租房平台

本系统功分为用户,经纪人,管理员三个角色,其中用户可以进行注册登陆系统,用户可以查看中介门店,查看经纪人,在线预定房源,在线租赁房源,可以发布求购房源,求租房源&#…

Mac/win开发快捷键、vs插件、库源码、开发中的专业名词

目录 触控板手势(2/3指) 鼠标右键 快捷键 鼠标选择后shift⬅️→改变选择 mac command⬅️:删除←边的全部内容 commadtab显示下栏 commandshiftz向后撤回 commandc/v复制粘贴 command ⬅️→回到行首/末 commandshift3/4截图 飞…

element dialog弹出框层级错乱问题

需要加modal-append-to-body 默认为true,遮罩层是否插入至 body 元素上,若为 false,则遮罩层会插入至 Dialog 的父元素上。 为false时的HTML结构 为true时的HTML结构 出现弹框层级错乱问题时可以modal-append-to-body是否设置为false了。

【LS科技芯团队成立】基础研究是科学之本、技术之源、创新之魂

目录 LS科技芯团队简介 团队创建人 成立本团队的核心目的 来自各个省份的大佬专家们 加入LS科技芯团队吧! LS科技芯团队简介 “LS科技芯”团队于2023年7月25日下午成立。汇聚了来自各个省份的技术博主,涵盖了电子技术,程序设计,…

软件兼容性测试中需注意的关键问题

在进行软件兼容性测试时,有一些关键问题需要特别注意,以确保测试的准确性和全面性。本文将介绍一些在软件兼容性测试中需注意的关键问题,帮助测试人员更好地进行兼容性测试工作。 首先,测试范围,测试人员需要明确测试的…

sql查询语句大全-详细讲解(格式、示例)

目录 范围查询 BETWEEN...AND in 为空 模糊查询 去重查询 AND OR 排序查询 聚合函数 1.count:计算个数 2.max:计算最大值 3.min:计算最小值 4.sum:计算和 5.avg:计算平均数 分组查询 group by 分组后…

vite / nuxt3 项目使用define配置/自定义,可以使用process.env.xxx获取的环境变量

每日鸡汤:每个你想要学习的瞬间,都是未来的你向自己求救 首先可以看一下我的这篇文章了解一下关于 process.env 的环境变量。 对于vite项目,在我们初始化项目之后,在浏览器中打印 process.env,只有 NODE_ENV这个变量&…

【HMS Core】统一扫描连续扫码、闪光灯关闭问题

【问题描述1】 使用Default View Mode进行扫码,如何实现连续扫码 【解决方案】 在默认扫码模式Default View中,功能是集成在SDK内部的,无法设置连续扫码模式等信息。 可以使用Customized View Mode这种模式,它提供了相关的api可…

【一天三道算法题】代码随想录——Day14

一. 有效的括号 题目链接:力扣 思路:无非三种情况: 1. 左侧括号多,右侧少 2. 左右侧一样多,该字符串属于有小括号字符串 3. 右侧括号多,左侧少 那么说白了就是要比较左右括号的数量,谁多&…

KNN背景分割算法

以下代码用OpenCV实现了视频中背景消除和提取的建模,涉及到KNN(K近邻算法),真题效果比较好,可以用来进行状态分析。 原理如下: 背景建模:在背景分割的开始阶段,建立背景模型。 前景…

容器部署jenkins定时构建于本地时间不一致

1. Dockerfile FROM jenkins/jenkins:2.411-jdk11 USER root #以下生成密钥方式为旧格式,因为新格式暂不能被"Publish over SSH--->Jenkins SSH Key"功能识别 RUN ssh-keygen -q -m PEM -t rsa -b 2048 -N -f /root/.ssh/id_rsa ADD ./apache-maven…

区分jdbcTemplate操作数据库和mybatis操作数据库

JdbcTemplate和MyBatis是Java中常用的两种数据库操作方式。它们在实现上有一些区别,下面我将为你介绍它们的主要特点和区别: JdbcTemplate: JdbcTemplate是Spring框架中提供的一个类,用于简化JDBC操作。使用JdbcTemplate时&#x…

【设计模式】观察者设计模式解析

目录 一、观察者模式定义 二、观察者模式角色 三、观察者模式类图 四、观察者模式实例 五、观察者模式优缺点 5.1、优点 5.2、缺点 六、观察者模式应用 6.1、Spring 中观察者模式的四个角色 6.2、coding~~~~~~ 一、观察者模式定义 观察者模式(Observer Pattern)&#…