MySQL数据库:SQL语言入门 【3】(学习笔记)
目录
5,TCL —— 事务控制语言(Transaction Control Language)
(1)事务的概念+作用
(2)事务的特性
【1】原子性
【2】一致性
【3】隔离性
【4】持久性
(3)并发事务带来的问题
【1】脏读
【2】不可重复读
【3】幻读
(4)事务的隔离级别
【1】分类
(5)jdbc对事务的操作
数据库对象
二,视图
(1)1,
2,好处
(1)简化用户操作:
(2)对机密数据提供安全保护:
3,jdbc操作
三,存储过程
1,什么是存储过程
2,存储过程的优点
(1) 提高执行性能。
(2)可减轻网络负担。
(3)可将数据库的处理黑匣子化。
3,jdbc操作
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 | X | √ |
| SERIALIZABLE serializable | X | X | X |
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;}}
数据库对象
事务,视图,存储过程,函数,DCL(数据控制语言),索引,触发器
二,视图
(1)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);}
三,存储过程
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();}
相关文章:
MySQL数据库:SQL语言入门 【3】(学习笔记)
目录 5,TCL —— 事务控制语言(Transaction Control Language) (1)事务的概念作用 (2)事务的特性 【1】原子性 【2】一致性 【3】隔离性 【4】持久性 (3)并发事务带来…...
uniapp 实现tabbar分类导航及滚动联动效果
思路:使用两个scroll-view,tabbar分类导航使用scrollleft移动,内容联动使用页面滚动onPageScroll监听滚动高度 效果图 <template><view class"content" ><view :class"[isSticky ? tab-sticky: ]">…...
华为数字化转型的本质为何是管理变革
随着全球经济的加速数字化转型,企业纷纷进入了数字化时代的大潮。华为作为数字化转型的领军者,已经成功实践了从传统企业向数字化企业的蜕变。对于企业而言,数字化转型不仅仅是新技术的应用,更是一场管理变革。在这场变革的背后&a…...
【数据库】深入解析慢 SQL 的识别与优化策略
文章目录 什么是慢 SQL?慢 SQL 的危害如何检测分析慢 SQL使用 MySQL 慢查询日志利用 EXPLAIN 分析执行计划通过 Profiling 获取详细执行信息借助慢 SQL 收集分析平台 实际案例解析:600秒的慢 SQL 优化之旅问题描述初步分析优化步骤1. 优化 SQL 语句结构2…...
Linux从入门到精通
远程连接linux操作系统 Linux的图形化界面并不稳定,因此往往使用命令行去接触Linux操作系统 远程连接到Linux操作系统需要借助一个叫做finalshell的软件,官方地址如下: finalshell官方下载 在linux的terminal终端中输入指令 ifconfig就可以…...
代码随想录算法训练营第四十四天|Day44 动态规划
1143.最长公共子序列 视频讲解:https://www.bilibili.com/video/BV1ye4y1L7CQ https://programmercarl.com/1143.%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%AD%90%E5%BA%8F%E5%88%97.html 思路 #define max(a, b) ((a) > (b) ? (a) : (b)) int longestCommonSu…...
C++初阶——优先队列
一、什么是优先队列 优先队列是一个容器适配器,存储于优先队列中的元素按照某种优先级自动排序。优先队列类似于堆,元素可以随时插入,但是只能弹出优先级最高的元素。默认是一个大根堆,也就是元素越大,优先级越高。 二…...
10月月报 | Apache DolphinScheduler进展总结
各位热爱 Apache DolphinScheduler 的小伙伴们,社区10月份月报更新啦!这里将记录 DolphinScheduler 社区每月的重要更新,欢迎关注! 月度Merge之星 感谢以下小伙伴10月份为 Apache DolphinScheduler 所做的精彩贡献(排…...
WSL--无需安装虚拟机和docker可以直接在Windows操作系统上使用Linux操作系统
安装WSL命令 管理员打开PowerShell或Windows命令提示符,输入wsl --install,然后回车 注意:此命令将启用运行 WSL 和安装 Linux 的 Ubuntu 发行版所需的功能。 注意:默认安装最新的Ubuntu发行版。 注意:默认安装路径是…...
《AI 之影》
《AI 之影》 城市的喧嚣如同一幅永不停息的画卷,在钢筋水泥的丛林中,人们匆忙地穿梭,追逐着各自的梦想与欲望。而在这看似平凡的都市之中,一场悄然的变革正在酝酿。 他叫佑介,一个孤独的城市漫步者。每天,他…...
QT5.14*解决QSslSocket::connectToHostEncrypted: TLS initialization faile
qDebug()<<"QSslSocket"<<QSslSocket::sslLibraryBuildVersionString();通过上述代码在QT控制台查看对应需要的SSL版本,QT5.14.*输出的内容为: OpenSSL 1.1.1d 10 Sep 2019从官方下载openssl安装包即可,在官网找了很…...
高效分支管理规范
一、目的 通过标准化的流程和最佳实践,确保代码组织清晰、版本控制高效、变更管理有序,从而提高软件开发的质量、效率和可维护性,支持团队协作和持续集成/持续部署流程,最终实现项目的长期成功和发展 二、分支命名规范 简洁明了…...
跟我学C++中级篇——RAII
一、什么是RAII Resource Acquisition Is Initialization,资源获取即初始化。C/C的开发者都知道,在这类语言的开发中,内存需要手动来控制。也就是说,释放和回收内存得开发者亲历亲为。从某种角度看,能够把控内存的细节…...
C语言第九周课——经典算法
目录 一、冒泡法排序 1.1原理 1.2代码实现(以升序排序为例) 1.3逻辑 1.4分析 二、二分法查找 2.1原理 2.2代码实现 2.3逻辑 2.4算法效率分析 三、素数判断 3.1原理 3.2代码实现 3.3逻辑 3.4分析 一、冒泡法排序 1.1原理 冒泡排序&…...
【Pikachu】XML外部实体注入实战
若天下不定,吾往;若世道不平,不回! 1.XXE漏洞实战 首先写入一个合法的xml文档 <?xml version "1.0"?> <!DOCTYPE gfzq [<!ENTITY gfzq "gfzq"> ]> <name>&gfzq;</name&…...
vue2项目中在线预览csv文件
简介 希望在项目中,在线预览.csv文件,本以为插件很多,结果都只是支持excel(.xls、.xlsx)一到.csv就歇菜。。。 关于文件预览 vue-office:文档、 查看在线演示demo,支持docx、.xlsx、pdf、ppt…...
基于VUE实现语音通话:边录边转发送语言消息、 播放pcm 音频
文章目录 引言I 音频协议音频格式:音频协议:II 实现协议创建ws对象初始化边录边转发送语言消息 setupPCM按下通话按钮时开始讲话,松开后停止讲话播放pcm 音频III 第三库recorderplayer调试引言 需求:电台通讯网(电台远程遥控软件-超短波)该系统通过网络、超短波终端等无线…...
PMP--一、二、三模、冲刺--分类--变更--技巧--特点
文章目录 一模二模三模冲刺14.敏捷--不确定性、风险和生命周期选择14.敏捷--特点--敏捷范围灵活,敏捷拥抱变更14.敏捷--阶段关口--在不同的组织、行业或工作类型中,阶段关口可能被称为阶段审查、阶段门、关键决策点和阶段入口或阶段出口。组织可以通过这…...
CSS Grid 布局实战:从入门到精通
文章目录 前言一、CSS Grid 布局概述1.1 什么是 CSS Grid 布局?1.2 主要特点 二、基本概念2.1 网格容器2.2 网格线2.3 网格轨道2.4 网格区域 三、常用属性3.1 定义网格结构3.2 控制网格项的位置3.3 控制网格间距3.4 自动填充和重复 四、实践案例4.1 项目结构4.2 HTM…...
git创建远程仓库,以gitee码云为例GitHub同理
git远程Remote服务端仓库构建的视频教程在这 Git建立服务端Remote远程仓库,gitee码云例,Github_哔哩哔哩_bilibili 1、登gitee码云/Github 登录 - Gitee.com https://github.com/ (没账号的注册一下就行) 点击如下图位置的创…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
