数据库Oracle从入门到精通!第四天(并发、锁、视图)

八、并发控制


数据库是一个共享资源,可以为多个应用程序所共享,这些程序可以串行执行(排队执行),但是很多情况下,可能出现多个程序或一个程序中的多个进程并行的执行,这就是数据库的并行操作(并发控制)。
在多用户数据库环境中,多个用户可以并行的存取数据库,如果不对并发操作进行控制,那么可能存取不正确的数据,或破坏数据库数据的一致性。

1. 并行的例子:其中T代表事务
(1)数据库并发过程中可能出现的问题


(2)并发过程中可能出现的问题的类型


1)脏读(dirty read):一个事务读取了另一个事务修改但是没有提交事务的数据,如果稍后这个修改被回滚,那么这个事务读取到的数据就是无效的脏数据。


2)不可重复读(nonrepeated read):一个事务执行了两次或两次以上的查询,但是每次查询的结果都不一样,原因通常是另一个事务在两次查询之间修改了数据。


3)幻读(phantom read):当一个事务读取几行记录后,另一个并发事务插入了一些记录,这些插入的记录满足第一个事务读取数据的条件,此时幻读就发生了,即后面查询的数据出现了原来没有的额外的记录。

2. 事务
事务是不可分割的原子单元,事务保证SQL语句要么全部执行,要么全部不执行,数据库中的事务往往是并发的。Oracle数据库默认情况下事务是自动提交的,这意味着每执行一条SQL语句,事务都会提交一次,可以改为手动提交:SET AUTOCOMMIT OFF,此时需要显式执行COMMIT来提交事务,ROLLBACK来回滚事务,当然也可以SET AUTOCOMMIT ON恢复成自动提交事务。


(1)事务的特性(ACID)
1)原子性(A):事务将多个对数据库的操作当成一个原子单元,要么全部执行成功,要门全部失败。
2)一致性(C):系统的状态要从一种一致性状态转到另一种一致性状态,不能违反完整性约束,即两次从同一个地方获取的数据要一致,不能不一致。


3)隔离性(I):事务必须是相互隔离的,多个用户操作同一个数据的时候,一个用户的操作不能去影响其他用户的操作。


4)持久性(D):已经提交的事务对数据库的修改是永久的,事务一旦提交,再回滚是没用的。

(2)事务的隔离级别:
1)序列化:Serializable,最严格的级别,事务串行执行(排队执行),没有并发问题,但是效率最低。
2)可重复读,Repeatable read,保证事务不会修改由其他一个事务读取但未提交的数据,可以避免脏读和不可重复读的并发问题,存在幻读问题,效率一般。


3)读已提交,Read Committed,是大多数数据库默认的隔离级别,保证事务不会读取另一个并行事务修改但未提交的数据,可以避免脏读,存在不可重复读和幻读问题,效率比较高。
其中Oracle数据库默认的隔离级别是读已提交,MySQL数据库默认的隔离级别是可重复读。

(3)锁机制
数据的不一致总是由两个因素造成:一是对数据的修改,二是并发操作的发生,因此为了保证数据的一致性,必须对并发操作进行控制,最常见的方式就是加锁,数据库中常见的锁有两种:排他锁(X)和共享锁(S)
1)排他锁(X)
如果事务T对数据D加上了X锁,则其他事务都不能再对数据D添加任何类型的锁,直到T释放D上的X锁(提交或回滚事务时)。一般要求在修改数据前向数据添加排他锁,所以排他锁也称为写锁,一个资源,比如一张表只能加一个排他锁,但是可以加多个共享锁。


2)共享锁(S)
如果事务T对数据D加上S锁,则其他事务也只能对D加S锁,不能加X锁,直到T释放D上的S锁,一般要求读取数据前向该数据加共享锁,所以共享锁也称为读锁,所以共享锁具有更高的并行性。

(4)Oracle数据库将锁分为以下几类:
1)数据锁:为了保护表,在多个用户并行存取数据时保证数据的完整性,DML操作可以在两个级别上获取数据锁:行锁和表锁,当某行要被修改的时候,事务会自动在该行加上排他锁


2)DDL锁:DDL锁保护模式对象结构的定义,DDL操作将影响对象,一个DDL语句会隐式的提交事务(会释放锁),比如创建表格时会提交事务并释放锁。


3)内部锁:保护内部数据库和内存结构

(5)数据库中加锁的两种方式:独占方式和共享方式
1)独占方式:不允许其他用户以任何方式共享锁定的资源,当进行数据库修改的时候就可以使用该模式,即加上排他锁。


2)共享模式:允许在数据访问时,并发的共享访问,但是当修改数据库时上升为独占模式,指共享锁。

(6)锁分为行级锁和表级锁,行级锁用于锁定某些记录,表级锁用于锁定整张表的所有记录。
1)行级锁


a.    当执行INSERT、UPDATE、DELETE等DML操作时,会隐式的加上行锁(排他锁),这意味其他事务只能查询这几行的数据,但是不能修改这些行的数据,直到排他锁被释放。


b.    显式通过”SELECT......FOR UPDATE”来加行锁,会将查询出来的这几行记录加上排他锁,其他事务也只能查询这几行,不能修改这几行。
示例:行锁
开启一个sqlplus(一个会话),即可开启了一个事务,将事务设置为手动提交
事务1:

此时,empno=7369的这一行就添加了行锁(排他锁),那么其他事务就只能查询不能修改这一行的记录,当然,其他非7369的行就没有加锁,其他事务就可以修改。
再开启一个sqlplus,即开启另一个事务:
事务2:

事务2去查询empno=7369这一行没有问题,但是不能去修改,试图修改empno=7369的事务会被阻塞,直到事务1提交事务释放锁之后,事务2才能修改成功:

事务2被阻塞了,原因是事务1对empno=7369这一行加了排他锁,其他事务就只能阻塞
然后事务1提交事务释放锁:

事务2就更新成功了:

注意:此时由于事务2执行了UPDATE语句,会隐式的给empno=7369这一行加上行锁,事务1也只能查询不能修改,修改的动作也会被阻塞,直到事务2提交事务释放锁才可以:
事务1:

事务1可以查询,但是更新会被阻塞
然后事务2提交事务:

事务1更新成功:

注意:行锁只对加锁的这几行数据有效,其他没有加行锁的数据其他事务还是可以修改的。

示例2:假如有其他用户要锁定同一个资源,可以使用wait子句对锁等待的时间(秒级)进行控制,例如:SELECT * FROM emp WHERE empno=7369 FOR UPDATE WAIT 3; 表示等待3秒,如果发现其他事务还没有释放锁,系统给出出错提示。
我们来操作一下,先将两个事务都COMMIT一次,保证两个事务的锁都被释放。

事务1:对7369加行锁

事务2:也试图对7369加行锁,但是由于事务1已经对7369加了行锁,其他事务不能再对7369加任何类型的锁,等到时间到了,系统给出提示:

2)表级锁:锁定整张表的所有记录,分为三种模式:
    共享模式:IN SHARE MODE
    共享更新模式:IN SHARE UPDATE MODE
    排他锁模式:IN EXCLUSIVE MODE
    表级锁的语法:LOCK TABLE 表名 锁模式;
a. 共享模式:不允许其他用户插入、更新和删除行,多个用户可以同时在一个表上设置共享锁,这样大家都只能查询,不能修改。
示例:先把事务1和事务2都COMMIT一次,全部释放锁
事务1:

事务2:可以查询,但是不能修改数据,直到事务1提交事务释放锁之后才行

事务1提交事务释放锁:

事务2更新成功:

如果事务1和事务2都加上表级共享锁,那么两个事务都只能查询,不能修改:


此时如果两个事务都去修改数据,就会出现死锁,因为两个事务都在等待对方释放锁,就会陷入死锁状态,死锁是我们要避免的一个问题。
b. 共享更新模式:允许多个用户同时锁定表的不同行,允许其他用户执行DML操作,除了已锁定的行。
示例:
LOCK TABLE emp IN SHARE UPDATE MODE;
SELECT * FROM emp WHERE deptno=30 FROM UPDATE; -- 锁定特定行,其他用户不能修改
SELECT * FROM emp WHERE deptno=30; -- 但是其他用户可以查询
示例:

事务1加了共享更新模式,对empno=8888加了行锁,那么事务2可以对其他行进行更新,但是不能对empno=8888进行更新,除非事务1提交事务释放锁:

直到事务1提交事务释放锁:

c. 排他锁模式
不允许其他用户插入、更新和删除行,允许查询数据,如果一个事务对表加了排他锁,其他事务不能再对这张表加任何类型的锁,包括共享锁。
示例1:还是两边都COMMIT一次
事务1:

事务2:也试图给emp加排他锁,会被阻塞

直到事务1提交或回滚事务释放锁之后,事务2加锁才能成功:

目前事务2加上了排他锁,事务1不能加任何类型的锁,包括共享锁:
事务1:

总结:一旦一个事务加了排他锁,其他事务只能查询,不能修改,例如:
两边都COMMIT一次:
事务1:

事务2:可以查询,但是修改emp表的任何一条记录都会被阻塞,直到事务1提交事务释放锁后才行:

事务1提交事务释放锁,事务2更新才能成功:

总结:共享锁的并发性比排他锁的好,对于排他锁,行锁的并发性比表锁的并发性好。

九、其他重要模式对象


1.其他重要模式对象,主要包含:索引、序列、视图
2.索引
(1)索引概述
1)索引(index)是为了提高数据库查询性能而建立的,利用它可以快速的确定指定的信息,索引就像书的目录。


2)索引可以建立在表的一列或多列上,一旦建立,由Oracle数据库自动维护和使用,但是当表中建立的索引过多的时候,修改、插入、删除的性能会下降,因为修改数据的时候,Oracle会去维护索引,带来额外的开销,所以索引并不是越多越好。


3)索引分为唯一索引和非唯一索引,唯一索引保证表中的索引字段不能重复,Oracle自动在UNIQUE字段上创建唯一索引。


4)Oracle自动在PRIMARY KEY 字段上创建主键索引,所以建议创建表的时候,一定要给出主键约束,以便通过主键来查询数据时利用主键索引提高查询的速度。


5)当WHERE子句中包含索引字段时,就会使用索引来检索数据,性能会大大增强,例如:SELECT * FROM emp WHERE empno=7369;


(2)创建索引的语法:
CREATE [UNIQUE] INDEX 索引名 ON 表名(索引列1,索引列2,...);
其中 UNIQUE 表示创建唯一索引,可以省略
示例:

(3)删除索引
DROP INDEX 索引名;

3.序列
(1)序列概述
序列(SEQUENCE)用于产生序列号(流水号),在多用户环境下使用序列特别有用,可以生成整数类型,最多可有38位的数字。

(2)创建序列的语法:
CREATE SEQUENCE 序列名 -- 创建序列
[START WITH 初始值] -- 序列的初始值,默认是1
[INCREMENT BY 递增值] -- 每次递增的值,默认是1
[MAXVALUE 最大值 | NOMAXVALUE] -- 能达到的最大值或没有限制
[MINVALUE 最小值 | NOMINVALUE] -- 最小值或没有限制
[CYCLE | NOCYCLE] -- 循环生成序列或不循环
[CACHE 缓冲数据个数 | NOCACHE] -- 保留在缓冲区中的序列值个数,缓冲区是为了提高读取速度,默认20个
[ORDER | NOORDER] -- 按照顺序生成序列值或不强调按照顺序生成
其中[]里面内容可以省略,”|”表示或者的意思

(3)序列中的两个伪列:currval和nextval,其中currval表示序列的当前值,nextval表示序列的下一个值
示例:

序列最大的用途是生成递增的主键值,例如:
创建users表,插入5条记录,使用序列生成递增的主键值:


(4)删除序列
DROP SEQUENCE 序列名;

4.视图:一张虚拟的数据库表
视图是从一个或多个基本表或视图中查询出来的记录形成的一张虚拟表,可以简单认为:
视图就是查询表或视图形成的一张虚拟表

视图只存放视图的定义,不会存放数据,视图的数据任然在原来的数据库表中。
(1)视图的作用:
1)视图能简化用户的操作
2)使用户能够以多种角度来看待同一个数据
3)对重构数据库提供了一定程度的逻辑独立性
4)能够对机密数据提供安全保护,比如只公开部分字段
(2)创建视图的语法
CREATE [OR REPLACE] VIEW 视图名 AS SELECT语句;
其中:
OR REPLACE:如果视图名已经存在,则替换,否则就创建新的视图,可以省略
SELECT语句:查询语句,可以是单表、多表或子查询
注意:创建视图必须具有CREATE VIEW或CREATE ANY VIEW的系统权限
示例:

示例2:

(3)删除视图
DROP VIEW 视图名;

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

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

相关文章

EXCEL(带图)转html

文章目录叙述1、效果2、excel 转换主逻辑3、其他补充3.0 主前端bootstrap3.1 my.css:3.2 my.js3.3 入口home.html3.4 Data.ashx叙述 要实现H5 展示excel 查询 了一下没有好的办法,自己写了一个,简单记录一下 1、效果 用bootstrap 根据sheet做了一个菜单。 2、exc…

小程序富文本Editor插入图片、超链接、公式等的一次尝试

小程序插入图片 通过EditorContext.insertImage接口可以实现图片的插入: EditorContext.insertImage({src,width,height,data, })如何插入超链接、公式、视频、表格等等? 通过EditorContext.insertCustomBlock应该是可以实现的,具体实现方式我没有了…

传输层协议TCP、UDP

传输层协议TCP、UDP 1、TCP和UDP报文格式 传输层协议TCPvsUDP 传输层主要两个传输协议,分别是TCP和UDP,负责提供流量控制、排序服务和错误校验。 (1)TCP是面向连接的,一般用于传输数据量比较少,且对可靠性要…

设计模式—专栏简介

大学总是忙着参加ACM实验室的各种事情,到了毕业的时候,对于设计模式也是仅了解单例模式。毕业后,刚开始代码也是乱写一通,完全没有章法。整个开发环境也是为了解决问题,从来没有考虑结构化什么的(没办法&am…

面试150 链表的复制

思路 python可以使用调库法,使用深度拷贝 """ # Definition for a Node. class Node:def __init__(self, x: int, next: Node None, random: Node None):self.val int(x)self.next nextself.random random """class Solution:de…

MySQL分布式ID冲突详解:场景、原因与解决方案

引言 在分布式系统开发中,你是否遇到过这样的崩溃时刻?——明明每个数据库实例的自增ID都从1开始,插入数据时却提示“Duplicate entry ‘100’ for key ‘PRIMARY’”;或者分库分表后,不同库里的订单ID竟然重复&#x…

c++文字游戏_闯关打怪2.0(开源)

本次更新内容: 1.增强对手性能 2.可暂停(按N) 3.修复些许bug 4.增加boos关(第10、20、30...关) 1. 游戏概述 本游戏是一个基于Windows控制台的回合制战斗游戏,采用俯视视角的2D平面设计。玩家控制角色"p"在1325大小的封闭场景中与敌人"@"战斗,通过…

Java学习第十二部分——idea各种项目简介

目录 一.前言 二.语言介绍 三.生成器介绍 四.拓展 一.前言 打开idea项目创建时发现如上情况,“新建项目”下面的是语言,生成器下面的是这些语言对应的生成器工具,本文将简单介绍。 二.语言介绍 Java 用途:Java是一种广泛使…

Codeforces Round 868 (Div. 2) D. Unique Palindromes(1900,构造)

Problem - D - Codeforces 不错的字符串构造体,记录一下 首先注意到k≤20这一条件。对于一个长度为n的字符串,最多有n个不同的回文子串,这种情况出现在所有字符都相同时。因此,限制条件中的xi必须满足xi≤ci,且相邻两…

ClickHouse 全生命周期性能优化

引言 ClickHouse作为列式存储的OLAP数据库,以其极致的查询性能著称,但"高性能"并非开箱即用。不合理的表设计、SQL写法或集群配置,可能导致性能衰减甚至服务不可用。本文基于ClickHouse 24.3版本,从设计规范、开发规范、…

Linux sed 命令 详解

在 Linux 系统中,sed(Stream Editor)是一个非常强大且灵活的文本处理工具。它不仅可以用于简单的文本替换、删除和插入操作,还能实现复杂的文本转换任务。 📌 一、什么是 sed? sed 是一个基于模式匹配对文…

项目进度同步不及时,如何提升信息透明度

项目进度同步不及时的核心问题包括沟通渠道不畅通、缺乏统一的信息平台、未建立明确的进度更新机制、团队意识不足、责任划分不明确等。其中,缺乏统一的信息平台最为关键。统一的信息平台能够确保所有相关人员实时掌握最新的进度状态,避免信息孤岛&#…

使用各种CSS美化网页

实验目的1.理解CSS的概念,掌握CSS定义样式的方法,具备使用CSS和相关库进行界面样式设计的能力。 2.掌握Bootstrap 5的基本使用方法。3.Bootstrap框架练习实验步骤1. 实验准备创建一个HTML文件(如 index.html)。引入Bootstrap5的CS…

在PPT的文本框中,解决一打字,英文双引号就变成中文了

问题:在制作PPT的过程中,插入文本框,在里面输入代码类的格式时,使用英文的双引号"",但是只要在后面输入内容,或者逗号等,英文双引号就变成中文了,很烦原因:大概…

iOS 证书过期如何处理

找到钥匙串位置创建新的CSR文件。点击菜单中钥匙串访问—>证书助理—>从证书颁发机构请求证书…进入证书助理,填写信息(用户名称和邮箱随便写),请求是 选择 存储到磁盘创建好CSR文件,回到developer 证书管理中心…

CODESYS + 全志T113-i + 国产系统OneOS,打造新一代工业控制解决方案!

创龙科技与中移物联网有限公司、CODESYS携手合作,成功实现了T113-i工业评估板对国产系统OneOS CODESYS软件的适配,此举将让工业自动化领域的工程师们更高效地开发,并为众多企业产品的快速上市提供强有力的保障。 解决方案简介 CODESYS简介 …

三、jenkins使用tomcat部署项目

一、安装tomcattomcat本来应该是第3台服务器的(第一台:gitlab,第二台:jenkins,第三台:tomcat),我这里资源有限,就把tomcat安装jenkins服务器了。#解压tocmcat [rootbogon…

华为eNSP防火墙实验(包含详细步骤)

拓扑图 这里要用的防火墙是 , 需要导入 目录 防火墙配置1(启动图形化界面) cloud配置 缓冲区服务器配置 防火墙配置2(各端口的ip地址) 外部路由器配置 本地路由器配置 防火墙配置3(配置安全策略&a…

Linux/Unix线程及其同步(create、wait、exit、互斥锁、条件变量、多线程)

线程 文章目录线程I 线程基本概念1、为什么引入线程2、PthreadsII 线程基本操作1、创建线程2、终止线程3、线程ID4、连接已终止线程5、线程基本操作示例III 通过互斥量同步线程1、基本概念2、互斥量(Mutex)3、静态分配互斥量4、互斥量锁定与解锁5、互斥量…

vue3 el-table 行数据沾满格 取消自动换行

在 Vue.js 使用 Element UI 或 Element Plus 的 <el-table> 组件时&#xff0c;如果你希望其中的单元格内容不自动换行&#xff0c;可以通过设置 CSS 样式来实现。这里有几种方法可以做到这一点&#xff1a;方法1&#xff1a;使用 CSS 样式你可以直接在 <el-table-col…