MySQL 视图与事务

news2024/11/20 12:38:50

文章目录

  • 视图
  • 事务
    • 事物的四大特性(ACID)
    • 事务的开启和结束
    • 事物隔离级别
      • 现象
        • 脏读
        • 不可重复度
        • 幻读
      • 隔离级别
        • 读未提交(READ UNCOMMITTED)
        • 读提交 (READ COMMITTED)
        • 可重复读 (REPECTABLE READ)
        • 串行化 (SERIALIZABLE)
    • 查看与设置事务隔离级别
    • 重复读的幻读问题
      • 快照读解决幻读
      • 当前读解决幻读
    • 出现幻读的两种情况
    • 幻读总结

视图

  • sql 语句很复杂,又要在很多地方写,改的时候太麻烦了,这时候可以用视图解决

  • 视图可以隐藏表的字段名。

根据视图来查的,所以如果起了别名别名就是那个试图的字段名

只能将select语句创建为视图

对视图增删改(DML:insert delete update)会影响到原表数据。

在这里插入图片描述



创建视图

create [or replace] view v_emp as select e.ename,d.dname from emp e join dept d on e.deptno = d.deptno;

修改视图

alter view v_emp as select e.ename,d.dname,d.deptno from emp e join dept d on e.deptno = d.deptno;

删除视图

drop view if exists v_emp;



事务

事物就是一个最小的工作单元,在数据库中,事物表示一件完整的事

例如:一个业务的完成可能需要多条DML语句共同配合才能完成,例如转账业务,需要执行两条DML语句,先更新张三账户的余额,再更新李四账户的余额,为了保证转账业务不出现问题,就必须保证要么同时成功,要么同时失败,怎么保证同时成功或者同时失败呢?就需要使用事务机制。

事务只针对DML语句有效:因为只有这三个语句是改变表中数据的。

  1. insert
  2. delete
  3. update


事物的四大特性(ACID)

  • 原子性(Atomicity):是指事务包含的所有操作要么全部成功,要么同时失败。

  • 一致性(Consistency):是指事务开始前,和事务完成后,数据应该是一致的。例如张三和李四的钱加起来是5000,中间不管进行过多少次的转账操作(update),总量5000是不会变的。这就是事务的一致性。

  • 隔离性(Isolation):隔离性是当多个⽤户并发访问数据库时,⽐如操作同⼀张表时,数据库为每⼀个⽤户开启的事务,不能被其他事务的操作所⼲扰,多个并发事务之间要相互隔离。

  • 持久性(Durability):一旦事务成功提交,其对数据库数据的更改将被永久保存下来,不会因为系统故障、断电等问题而丢失这些更改


事务的开启和结束

MySQL 事物如果不执行:strat[begin] trancaction ,就一条语句提交一次事物。我们实际的业务是一堆 DML 构成事物,所以需要手动开启事物

回滚:rollback

提交:commit;

只要手动开启事物:执行回滚或者提交就是一次结束操作。所以要想好再提交,提交之后就回滚不了了



事物隔离级别

在这里插入图片描述

  • 隔离级别从低到高:读未提交 < 读提交 < 读可重复读 < 串行化

  • 现象的严重程度从低到高:幻读 < 不可重复读 < 脏读

mysql数据库默认是 读提交。Oracle 默认是 可重复读

存在脏读的话,就一定存在不可重复读和幻读问题。



现象

脏读

一个事务读取了,另一个事务未提交的数据。就是读取到了另一个事务中的脏数据。在这种情况下,如果事物回滚或者修改了这些数据,那么读取这些脏数据的事务所处理的数据就是不准确的。


不可重复度

一个事务内,多次读取同一个数据行。得到的结果可能不一样。这是由于其他事务对数据进行了修改操作。导致数据的不一致性


幻读

事务执行过程中,前后两次相同的查询条件得到的结果不一,可能会变多或变少



隔离级别

读未提交(READ UNCOMMITTED)

A事务与B事务,A事务可以读取到B事务未提交的数据。这是最低的隔离级别。几乎两个事务之间没有隔离。这种隔离级别是一种理论层面的,在实际的数据库产品中,没有从这个级别起步的。


读提交 (READ COMMITTED)

A事务与B事务,A事务可以读取到B事务提交之后的数据。Oracle数据库默认的就是这种隔离级别。


可重复读 (REPECTABLE READ)

A事务和B事务,A事务开启后,读取了某一条记录,然后B事务对这条记录进行修改并提交,A事务读取到的还是修改前的数据。这种隔离级别称为可重复读。MySQL数据库默认就是这种隔离级别。


串行化 (SERIALIZABLE)

这种隔离级别最高,避免了所有的问题,缺点是效率低,因为这种隔离级别会导致事务排队处理,不支持并发。



查看与设置事务隔离级别

查看当前事务隔离级别

select @@transaction_isolation -查看当前会话隔离级别
select @@gobal.transaction_isolation -查看全局的隔离级别

设置事务隔离级别

会话级:set session transaction isolation level 事务隔离级别
全局级:set global transaction isolation level 事务隔离级别

事务隔离级别:
1.read uncommitted
2.read committed
3.repeatable read
4.serializable


重复读的幻读问题

可重复读,能很大程度上避免了幻读问题,但是并不能完全解决。



快照读解决幻读

普通的 select 语句都是采用快照读。(类似就是把那个时间段的表数据,保留下来。)

原理:

​ 由 MVCC(多版本并发控制) 实现,实现的方式是开始事务后会创建一个 Read View 对象,后续查询语句利用整个 Read View,通过这个 Read View 就可以在 undo log 版本链找到快照查询执行时候的那个版本的数据。所以事务过程中每次快照查询数据都是一样的,即使中途有其他事务插入了新记录,是查询不出来这条数据的。避免了幻读


当前读解决幻读

当前读包括:update、delete、insert、select…for update。就是 DML 加上 for update。单独执行 DML 语句也会隐式执行当前读

原理:

select…for update加的锁叫做:next-key lock。我们可以称其为:间隙锁 + 记录锁。间隙锁用来保证在锁定的范围内不允许insert操作。记录锁用来保证在锁定的范围内不允许delete和update操作。提交后锁失效



出现幻读的两种情况

在同一个事务处理过程中,如果前后两次都采用快照读,或者都采用当前读,则不会出现幻读问题。如果第一次使用快照读,后面使用了当前读,则会出现幻读问题。



第一种产生幻读的场景

A事务与B事务。在A事务中第一次查询使用快照读,B事务插入数据。然后在A事务中第二次查询使用当前读。则会产生幻读现象。


第二种产生幻读的场景

事务A与事务B,在事务A中第一次查询使用快照读,在事务B中插入一条数据,然后在事务A中更新事务B插入的那条记录,最后在事务A中再次使用快照读。则会发生幻读现象。



幻读总结

MySQL 可重复读隔离级别并没有彻底解决幻读,只是很大程度上避免了幻读现象的发生。
要避免这类特殊场景下发生幻读的现象的话,就是尽量在开启事务之后,马上执行 select … for update 这类当前读的语句,因为它会对记录加 next-key lock,把数据锁住。从而避免其他事务插入一条新记录。

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

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

相关文章

【前端 13】Vue快速入门

Vue快速入门 在现代Web开发中&#xff0c;尽管通过HTML、CSS和JavaScript我们能够构建出美观且功能丰富的页面&#xff0c;但随着项目规模的增大&#xff0c;这种传统的开发方式在效率上逐渐显得力不从心。为了提高开发效率&#xff0c;前端开发者们引入了多种框架和库&#x…

Python酷库之旅-第三方库Pandas(050)

目录 一、用法精讲 181、pandas.Series.var方法 181-1、语法 181-2、参数 181-3、功能 181-4、返回值 181-5、说明 181-6、用法 181-6-1、数据准备 181-6-2、代码示例 181-6-3、结果输出 182、pandas.Series.kurtosis方法 182-1、语法 182-2、参数 182-3、功能 …

异步通信方式的两种消息传输模型

文章目录 一、点对点模型1.1 什么是点对点模型1.2 点对点模型的特点 二、发布订阅模型2.1 什么是发布订阅模型2.2 发布订阅模式的日常案例2.3 发布订阅模型的特点 三、总结参考资料 一、点对点模型 1.1 什么是点对点模型 点对点模型&#xff08;也叫队列模型&#xff09; 1.2…

Shiro安全框架与SpringBoot的整合(下)

目录 一、整合前的配置 1.1 导入shiro依赖 1.2 config配置 1.2.1 ShiroConfig&#xff08;⭐&#xff09; 1.2.2 MyConfig(拦截器配置) 3. 拦截器(LoginInterceptor) 二、认证登录 2.1. controller 2.2 service和serviceImpl&#xff08;不用&#xff09; 2.3 mapper …

[Meachines] [Easy] Blocky Jar包反编译

信息收集 IP AddressOpening Ports10.10.10.37TCP:21,22,80,25565 $ nmap -p- 10.10.10.37 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 21/tcp open ftp ProFTPD 1.3.5a 22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu …

自动驾驶的六个级别是什么?

自动驾驶汽车和先进的驾驶辅助系统&#xff08;ADAS&#xff09;预计将帮助拯救全球数百万人的生命&#xff0c;消除拥堵&#xff0c;减少排放&#xff0c;并使我们能够在人而不是汽车周围重建城市。 自动驾驶的世界并不只由一个维度组成。从没有任何自动化到完整的自主体验&a…

VScode调试Python代码

用Python debugger 参考 vscode-python的debug 教学(最全)

动手学深度学习55 循环神经网络 RNN 的实现

动手学深度学习55 循环神经网络 RNN 的实现 从零开始实现简洁实现QA 课件&#xff1a;https://zh-v2.d2l.ai/chapter_recurrent-neural-networks/rnn-scratch.html 从零开始实现 %matplotlib inline import math import torch from torch import nn from torch.nn import fun…

【前端逆向】最佳JS反编译利器,原来就是chrome!

有时候需要反编译别人的 min.js。 比如简单改库、看看别人的 min,js 干了什么&#xff0c;有没有重复加载&#xff1f;此时就需要去反编译Javascript。 Vscode 里面有一些反编译插件&#xff0c;某某Beautify等等。但这些插件看人品&#xff0c;运气不好搞的话&#xff0c;反…

力扣高频SQL 50题(基础版)第二十题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第二十题2356.每位教师所教授的科目种类的数量题目说明思路分析实现过程准备数据实现方式结果截图 力扣高频SQL 50题&#xff08;基础版&#xff09;第二十题 2356.每位教师所教授的科目种类的数量 题目说明 表: Te…

算法——二分查找(day10)

目录 69. x 的平方根 题目解析&#xff1a; 算法解析&#xff1a; 代码&#xff1a; 35. 搜索插入位置 题目解析&#xff1a; 算法解析&#xff1a; 代码&#xff1a; 69. x 的平方根 69. x 的平方根 - 力扣&#xff08;LeetCode&#xff09; 题目解析&#xff1a; 老…

2025第十九届中国欧亚国际军民两用技术及西安国防电子航空航天暨无人机展

2025第十九届中国欧亚国际军民两用技术及西安国防电子航空航天暨无人机展 时间&#xff1a;2025年3月14-16日 地点&#xff1a;西安国际会展中心 详询主办方陆先生 I38&#xff08;前三位&#xff09; I82I&#xff08;中间四位&#xff09; 9I72&#xff08;后面四位&am…

中间层 k8s(Kubernetes) 到底是什么,架构是怎么样的?

你是一个程序员&#xff0c;你用代码写了一个博客应用服务&#xff0c;并将它部署在了云平台上。 但应用服务太过受欢迎&#xff0c;访问量太大&#xff0c;经常会挂。 所以你用了一些工具自动重启挂掉的应用服务&#xff0c;并且将应用服务部署在了好几个服务器上&#xff0c;…

【C++】实验六

题目&#xff1a; 1、苹果和虫子 描述&#xff1a;你买了一箱n个苹果&#xff0c;很不幸的是买完时箱子里混进了一条虫子。虫子每x小时能吃掉一个苹果&#xff0c;假设虫子在吃完一个苹果之前不会吃另一个&#xff0c;那么经过y小时你还有多少个完整的苹果&#xff1f; 输入…

Linux基础复习(三)

前言 接Linux基础复习二 一、常用命令及其解释 Tab补全 在上一篇文章配置了IP然后通过远程SSH连接软件控制主机&#xff0c;在配置过程中会发现有些命令过于长&#xff0c;那么&#xff0c;Tab键补全就可以很好的帮助我们去快速的敲出命令&#xff0c;同时如果有些命令有遗…

AJAX(1)——axios库的使用

什么是AJAX? AJAX是异步的JavaScript和XML。简单来说&#xff0c;就是使用XMLHttpRequest对象与服务器通信。它可以使用JSON,XML,HTML和text文本等格式发送和接收数据。AJAX最吸引人的就是它异步的特性&#xff0c;也就是说它可以在不重新刷新页面的情况下与服务器通信&#…

免费【2024】springboot 宠物救助管理系统的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

成为git砖家(4): git status 命令简介

1. untracked 和 tracked 状态 Remember that each file in your working directory can be in one of two states: tracked or untracked. Tracked files are files that were in the last snapshot, as well as any newly staged files; they can be unmodified, modified, o…

Feign自定义调用第三方接口并实现负载均衡

Feign自定义调用第三方接口并实现负载均衡 Feign简介&#xff1a; Feign 是一个声明式的、模板化的HTTP客户端&#xff0c;用于简化HTTP客户端的开发。它是Spring Cloud Netflix微服务套件中的一部分&#xff0c;使得编写Java HTTP客户端变得更加容易。它的原理主要是代理模式…

Rust |了解+ 环境配置(rust+vscode)

1 了解rust 1️⃣0️⃣0️⃣秒了解Rust_哔哩哔哩_bilibili 2 安装rust 前提安装过vs&#xff0c;有c环境 1.下载 根据自己的系统下载对应的版本&#xff1a;安装地址 查看自己版本&#xff1a; 右键 此电脑 &#xff1b;点击 属性 &#xff1b;查看 系统类型 点击 下载RU…