MySQL数据库:SQL语言入门 【下】(学习笔记)

5,TCL —— 事务控制语言(Transaction Control Language)

          用于数据库的事务管理。

(1)事务的概念+作用

          事务(Transaction)指的是一个操作序列,该操作序列中的多个操作要么都做,要么都不做,是一个不可分割的工作单位,是数据库环境中的逻辑工作单位,由DBMS(数据库管理系统)中的事务管理子系统负责事务的处理。

           保证数据库的完整性,保证一系列DML 操作要么全都执行,要么全都不执行。(要么全成功,要么全失败)

(2)事务的特性

并不是所有的操作序列都可以称为事务,这是因为一个操作序列要成为事务,必须满足事务的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这四个特性简称为ACID特性【必问】

        【1】原子性

原子是自然界最小的颗粒,具有不可再分的特性。

事务中的所有操作可以看做一个原子,事务是应用中不可再分的最小的逻辑执行体。

使用事务对数据进行修改的操作序列,要么全部执行,要么全不执行。

        【2】一致性

事务开始前后,状态一致

        【3】隔离性

隔离性是指各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务,都是隔离的。(并发执行的事务之间既不能看到对方的中间状态,也不能相互影响。)

        【4】持久性

持久性指事务一旦提交,对数据所做的任何改变,都要记录到永久存储器中,通常是保存进物理数据库,即使数据库出现故障,提交的数据也应该能够恢复。但如果是由于外部原因导致的数据库故障,如硬盘被损坏,那么之前提交的数据则有可能会丢失。

(3)并发事务带来的问题

        【1】脏读

当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。

读到了别人事务中没提交的数据   ,读到的数据  就叫做 脏数据,本次读取 就叫做 脏读。    

(不可以接收)

        【2】不可重复读

 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。

-- 读到了别人事务提交后   又修改后的数据 ,   

(可以接收)

        【3】幻读

 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。

读到了别人事务提交后   又 添加 或者 删除 后的数据

(可以接收)

不可重复度和幻读区别: 

  • 不可重复读的重点是修改,幻读的重点在于新增或者删除。
  • 解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表 

(4)事务的隔离级别 

MySQL数据库 解决事务并发问题  的解决方案————调整MySQL数据库的隔离级别

事务的隔离级别用于决定如何控制并发用户读写数据的操作

数据库是允许多用户并发访问的,如果多个用户同时开启事务并对同一数据进行读写操作的话,有可能会出现脏读、不可重复读和幻读问题,所以MySQL中提供了四种隔离级别来解决上述问题。

mysql数据库默认的隔离级别是 REPEATABLE READ(可重复读取)。

        【1】分类

从低到高依次为

READ UNCOMMITTED(读取未提交的)READ COMMITTED(读取已提交的)REPEATABLE READ(可重复读取)以及 SERIALIZABLE

隔离级别越低,越能支持高并发的数据库操作。

  隔离级别  脏读   不可重复读  幻读 

 READ UNCOMMITTED

read uncommitted

√  √  √  

  READ COMMITTED 

read committed

X√  √  

 REPEATABLE READ  默认

repeatable read

X√  

 SERIALIZABLE  

serializable

XX

                      PS:√  代表会出现问题   , X代表不会出现问题 = 解决问题

  (5)jdbc对事务的操作

          【1】准备表

-- 创建表
create table account(id int primary key auto_increment,uname varchar(10) not null,balance double check (balance >=0)
);
-- 准备数据
insert into account values(null,'张三',400);
insert into account values(null,'李四',400);-- 修改  代码中需要
update account set balance=balance+500 where uname='李四'
update account set balance=balance-500 where uname='张三'

        【2】Java 代码  【jdbc】

测试事务:

@Testpublic void test1() throws SQLException {DBHelper db=new DBHelper();Connection con=db.getcon();PreparedStatement ps=null;try {con.setAutoCommit(false);//取消jdbc自动提交ps = con.prepareStatement("update account set balance=banlance+500 where uname ='李四'");ps.execute();ps.execute("update account set balance=banlance-500 where uname ='张三'");con.commit();//提交System.out.println("转账成功");} catch (SQLException e) {System.out.println(e);}finally {System.out.println("转账失败,操作回滚!");con.rollback();//回滚db.closeAll(con,ps,null);}}

[PS:测试用的单元测试,如果有异常,可以改用 main方法运行]

工具类 DBHelper   ————注意调用的库名!!!

package mysql3;import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;/*** 工具类*/
public class DBHelper {/*** 获得数据源,获得连接对象** @return*/public Connection getcon() {Connection con = null;try {Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://127.0.0.1:3306/demodvd?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";String username = "root";String password = "root";con = DriverManager.getConnection(url, username, password);} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();}return con;}/*** 关闭资源** @param con* @param ps* @param rs*/public void closeAll(Connection con, PreparedStatement ps, ResultSet rs) {try {if (con != null) {con.close();}if (ps != null) {ps.close();}if (rs != null) {rs.close();}} catch (SQLException e) {e.printStackTrace();}}/*** 增加,删除,修改 ---- 方法汇总** @param sql* @param arrs* @return*/public int update(String sql, Object... arrs) {Connection con = getcon();PreparedStatement ps = null;int count = 0;try {ps = con.prepareStatement(sql);for (int i = 0; i < arrs.length; i++) {ps.setObject((i + 1), arrs[i]);}count = ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();}return count;}public List query(String sql, Class cla, Object... arrs) {List list = new ArrayList<>();Connection con = getcon();PreparedStatement ps = null;ResultSet rs = null;try {ps = con.prepareStatement(sql);for (int i = 0; i < arrs.length; i++) {ps.setObject((i + 1), arrs[i]);}rs = ps.executeQuery();while (rs.next()) {Object obj = cla.newInstance();Field[] fs = cla.getDeclaredFields();for (Field f : fs) {f.setAccessible(true);Object value = rs.getObject(f.getName());f.set(obj, rs.getObject(f.getName()));}list.add(obj);}} catch (SQLException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} finally {closeAll(con, ps, rs);}return list;}}

 (6)视图

         【1】概念

视图(view)是一个从单张或多张基础数据表或其他视图中构建出来的虚拟表

同基础表一样,视图中也包含了一系列带有名称的列和行数据,但是数据库中只是存放视图的定义,也就是动态检索数据的查询语句,而并不存放视图中的数据,这些数据依旧存放于构建视图的基础表中,只有当用户使用视图时才去数据库请求相对应的数据,

即视图中的数据是在引用视图时动态生成的。因此视图中的数据依赖于构建视图的基础表,如果基本表中的数据发生了变化,视图中相应的数据也会跟着改变。

PS:视图本质上就是:一个查询语句,是一个虚拟的表,不存在的表,你查看视图,其实就是查看视图对应的sql语句

         【2】好处
             1,简化用户操作

                          视图可以使用户将注意力集中在所关心地数据上,而不需要关心数据表的结构、与其他表的关联条件以及查询条件等。

            2,对机密数据提供安全保护

                      有了视图,就可以在设计数据库应用系统时,对不同的用户定义不同的视图,避免机密数据(如,敏感字段“salary”)出现在不应该看到这些数据的用户视图上。这样视图就自动提供了对机密数据的安全保护功能

         【3】jdbc操作
  • 创建视图   
-- 创建视图   多表create view v_eds
as
select e.*,d.dname,d.loc,s.*
from emp e inner join dept d on d.deptno=e.deptnoinner join salgrade s on s.losal<=e.sal and s.hisal>=e.sal-- 使用视图select * from v_eds where deptno=10============================================================================-- 创建视图     单表
create view v_emp
as
select empno,ename,job,deptno from emp;-- 使用视图
select * from v_emp where deptno=10
  • Java 代码  【jdbc】   (多表)
public static void main(String[] args) throws SQLException {DBHelper db = new DBHelper();Connection con = db.getcon();PreparedStatement ps = con.prepareStatement("select * from v_eds where deptno=?");ps.setInt(1, 0);ResultSet rs = ps.executeQuery();while (rs.next()) {System.out.println(rs.getString("ename")+ "\t" + rs.getString("sal")+ "\t" + rs.getString("dname")+ "\t" + rs.getString("grade"));}db.closeAll(con, ps, rs);}

(7)存储过程

        【1】什么是存储过程

                存储过程就是数据库中保存(Stored)的一系列SQL命令(Procedure)的集合。也可以将其看作相互之间有关系的SQL命令组织在一起形成的一个小程序。

       【2】存储过程的优点
               1, 提高执行性能。

                          存储过程执行效率之所高,在于普通的SQL语句,每次都会对语法分析,编译,执行,而存储过程只是在第一次执行语法分析,编译,执行,以后都是对结果进行调用。

               2,可减轻网络负担。

                        使用存储过程,复杂的数据库操作也可以在数据库服务器中完成。只需要从客户端(或应用程序)传递给数据库必要的参数就行,比起需要多次传递SQL命令本身,这大大减轻了网络负担。

               3,可将数据库的处理黑匣子化。

                         应用程序中完全不用考虑存储过程的内部详细处理,只需要知道调用哪个存储过程就可以了

       【3】jdbc操作
  • 创建函数
-- 创建函数 
create procedure proemp1(name varchar(10))
beginif name is null or name = "" thenselect * from emp;elseselect * from emp where ename like concat('%',name,'%');end if;    
end;-- 使用
call proemp1('A')
call proemp1(null)
  • Java 操作
 @Testpublic void test3() throws SQLException {mysql3.DBHelper db = new mysql3.DBHelper();Connection con = db.getcon();CallableStatement cs = con.prepareCall("{call proemp1(?)}");cs.setString(1, "A");ResultSet rs = cs.executeQuery();while (rs.next()) {System.out.println(rs.getInt("empno")+ "\t" + rs.getString("ename")+ "\t" + rs.getString("job")+ "\t" + rs.getInt("deptno"));}rs.close();cs.close();con.close();}

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

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

相关文章

❤React-React 组件基础(类组件)

❤React-React 组件基础 1、组件化开发介绍 组件化开发思想&#xff1a;分而治之 React的组件按照不同的方式可以分成类组件&#xff1a; 划分方式一&#xff08;按照组件的定义方式&#xff09; 函数组件(Functional Component )和类组件(Class Component)&#xff1b; …

2024/11/13 英语每日一段

The new policy has drawn many critics. Data and privacy experts said the Metropolitan Transit Authority’s new initiative doesn’t address the underlying problem that causes fare evasion, which is related to poverty and access. Instead, the program tries “…

MySQL重难点(一)索引

目录 一、引子&#xff1a;MySQL与磁盘间的交互基本单元&#xff1a;Page 1、重要问题&#xff1a;为什么 MySQL 每次与磁盘交互&#xff0c;都要以 16KB 为基本单元&#xff1f;为什么不用多少加载多少&#xff1f; 2、有关MySQL的一些共识 3、如何管理 Page 3.1 单个 P…

【软件工程】一篇入门UML建模图(类图)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;软件开发必练内功_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前…

vue2+ element ui 集成pdfjs-dist

目录 1. 下载Pdf.js1.1 下载1.2 修改配置1.2.1 将pdfjs-3.8.162-dist复制到项目中1.2.2 解决跨域问题1.2.3 将pdf.worker.js文件复制到public目录下1.2.4 安装 pdfjs-dist1.2.5 前端vue代码(示例) 3. 参考资料 1. 下载Pdf.js 1.1 下载 下载链接&#xff08;官方&#xff09;需…

蓝桥杯每日真题 - 第7天

题目&#xff1a;&#xff08;爬山&#xff09; 题目描述&#xff08;X届 C&C B组X题&#xff09; 解题思路&#xff1a; 前缀和构造&#xff1a;为了高效地计算子数组的和&#xff0c;我们可以先构造前缀和数组 a&#xff0c;其中 a[i] 表示从第 1 个元素到第 i 个元素的…

大语言模型:解锁自然语言处理的无限可能

0.引言 在当今的科技时代&#xff0c;自然语言处理技术正以前所未有的速度发展&#xff0c;语言大模型作为其中的核心力量&#xff0c;对各个领域产生了深远的影响。本文旨在探讨语言大模型的发展历程、核心技术以及广泛的应用场景&#xff0c;以帮助读者更好地理解这一前沿技…

【vue2.0入门】vue基本语法

目录 引言一、页面动态插值1. 一般用法 二、计算属性computed三、动态class、style绑定四、条件渲染与列表渲染五、事件处理六、表单输入绑定七、总结 引言 本系列教程旨在帮助一些零基础的玩家快速上手前端开发。基于我自学的经验会删减部分使用频率不高的内容&#xff0c;并不…

【STM32F1】——无线收发模块RF200与串口通信

【STM32F1】——无线收发模块RF200与串口通信 一、简介 本篇主要对调试无线收发模块RF200的过程进行总结&#xff0c;实现了以下功能。 串口普通收发&#xff1a;使用STM32F103C8T6的USART2串口接收中断&#xff0c;实现两个无线收发模块RF200间的通信。 二、RF200介绍 电压…

《TCP/IP网络编程》学习笔记 | Chapter 8:域名及网络地址

《TCP/IP网络编程》学习笔记 | Chapter 8&#xff1a;域名及网络地址 《TCP/IP网络编程》学习笔记 | Chapter 8&#xff1a;域名及网络地址域名系统什么是域名&#xff1f;DNS 服务器IP 地址和域名之间的转换使用域名的必要性利用域名获取 IP 地址利用 IP 地址获取域名 基于 Wi…

前端开发中常用的包管理器(npm、yarn、pnpm、bower、parcel)

文章目录 1. npm (Node Package Manager)2. Yarn (Yarn Package Manager)3. pnpm4. Bower5. Parcel总结 前端开发中常用的包管理器主要有以下几个&#xff1a; 1. npm (Node Package Manager) 简介&#xff1a; npm 是 Node.js 的默认包管理器&#xff0c;也是最广泛使用的包…

HarmonyOS 如何实现传输中的数据加密

文章目录 摘要引言数据传输加密概述选择加密算法和传输协议加密实现方案与 Demo 代码配置 HTTPS/TLSAES 加密的实现代码详解RSA加密的实现代码详解 QA环节总结参考资料 摘要 本文将介绍在 HarmonyOS 应用中如何实现数据传输的加密策略。我们将讨论常见的加密算法&#xff08;如…

ArkTs简单入门案例:简单的图片切换应用界面

在鸿蒙 OS 应用开发的过程中&#xff0c;我们常常需要通过组合各种组件和编写相应的逻辑来实现丰富多样的功能。今天&#xff0c;我就来和大家详细解析一段实现简单图片切换功能的代码&#xff0c;希望能帮助到那些刚接触鸿蒙 OS 应用开发的朋友们。 一、代码导入部分 Entry …

influxDB 时序数据库安装 flux语法 restful接口 nodjsAPI

安装 Install InfluxDB | InfluxDB OSS v2 Documentation Debian和Ubuntu用户可以用apt-get包管理来安装最新版本的InfluxDB。 对于Ubuntu用户&#xff0c;可以用下面的命令添加InfluxDB的仓库&#xff0c;添加之后即可apt-get 安装influxdb2 wget -q https://repos.influx…

丹摩征文活动|丹摩智算平台使用指南

目录 1. 登录平台与工作环境设置1.1 访问与登录1.2 创建或选择项目1.3 初始化项目环境 2. 数据上传与管理2.1 数据上传2.2 数据管理与预处理2.3 数据可视化 3. 模型构建与训练3.1 模型选择3.2 参数配置3.3 模型训练与评估 4. 模型部署与应用4.1 模型部署4.2 接口调用与集成4.3 …

NAT网络工作原理和NAT类型

NAT基本工作流程 通常情况下&#xff0c;某个局域网中&#xff0c;只有路由器的ip是公网的&#xff0c;局域网中的设备都是内网ip&#xff0c;内网ip不具备直接与外部应用通信的能力。 处于内网的设备如何借助NAT来实现访问外网的应用&#xff1f; 对于开启了NAT功能的局域网…

LLMs 如何处理相互矛盾的指令?指令遵循优先级实验

编者按&#xff1a;想象一下&#xff0c;你正在开发一个 AI 助手&#xff0c;突然发现 system message 和用户提示词存在冲突&#xff0c;这时 AI 会听谁的&#xff1f;这种情况不仅困扰着开发者&#xff0c;还可能导致 AI 系统的不稳定和不可预测&#xff0c;影响用户体验和系…

qt QProcess详解

1、概述 QProcess是Qt框架提供的一个类&#xff0c;它用于在应用程序中执行外部进程。QProcess提供了一系列函数来启动、控制和与外部进程进行交互&#xff0c;使得开发者能够在自己的应用程序中集成和调用其他程序或服务。这个类在需要执行系统命令、启动其他应用程序或进行文…

Appium配置2024.11.12

百度得知&#xff1a;谷歌从安卓9之后不再提供真机layout inspector查看&#xff0c;仅用于支持ide编写的app调试用 所以最新版android studio的android sdk目录下已经没有了布局查看工具... windows x64操作系统 小米k30 pro手机 安卓手机 Android 12 第一步&#xff1a…

《ElementPlus 与 ElementUI 差异集合》Icon 图标 More 差异说明

参考 《element plus 使用 icon 图标(两种方式)》使用 icon 升级 Vue2 升级 Vue3 项目时&#xff0c;遇到命名时的实心与空心点差异&#xff01; ElementUI&#xff1a; 实心是 el-icon-more空心是 el-icon-more-outline ElementPlus&#xff1a; 实心是 el-icon-more-fill…