百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

Oracle数据库锁机制(oracle 锁数据)

sinye56 2024-10-14 16:09 4 浏览 0 评论



为了解决数据库被并发事物访问所带来的问题,数据库提供了锁机制来应对。数据库锁根据锁定的对象不同,可以分为表级锁和行级锁,表级锁锁定的对象是整张表,行级锁锁定的对象是特定的数据行;根据锁之间的关系可以分为共享锁和独占锁,共享锁允许其他事物获取共享锁,但是不予许其他事物获取独占锁。独占锁既不允许其他事物获取共享锁,又不允许其他事物获取独占锁。

行级锁:insert 、update、 delte 和 select…for update等都会隐士的获取一个行级锁。

表级锁:lock table tableName in shre mode 或 lock tabletableName in exclusive mode的获取一个表级锁。

共享锁:共享锁只支持表级锁,没有行级别的。通过lock table tableName in shre mode 添加。

独占锁:所有的行级锁都是独占锁。Lock table tableName inexlusive mode对整张表获取独占锁。

共享锁的行为:每个事物的共享锁都防止其他事物的独占锁,但是自己的共享锁不妨自己的独占锁。如果事物A独自获取了表T的共享锁,那么事物A还可以获取表T上的独占锁;如果事物A获取了表T的共享锁,事物B也获取了表T的共享锁,那么此时事物A不能获取T的独占锁了,因为事物B的共享锁不允许。

事物A:locktable tt_stu insharemode;

事物A进行如下操作会成功:insertinto tt_stu values(4,'a')

deletefrom tt_stu whereid=3;

update tt_stu setname='llll0l'whereid=1;

SELECT * FROM tt_stu whereid=2forupdate;

这四个操作都需要独占锁,因为只有自己持有共享锁,同一个事物的共享锁允许自己的独占锁。反过来自己的独占锁也不会排斥自己的共享锁,也就是自己不排斥自己。

如果上述情况,事物A在进行增删改查之前,事物B也执行了locktable tt_stu insharemode;则后四个操作会被阻塞,直到事物B提交了事物释放了共享锁。

如果上述情况,事物A执行了insert语句,则此时事物B去执行locktable tt_stu insharemode;事物B会被阻塞,因为事物A不仅有表上的共享锁,insert会隐式添加一个独占锁,阻止了事物B的共享锁。

独占锁的行为:每个事物的独占锁,都防止其他事物的共享锁和独占锁,允许自身事物的共享锁和独占锁。

事物A:locktable tt_stu inexclusivemode;

事物A进行如下操作都会成功:insertinto tt_stu values(4,'a');

deletefrom tt_stu whereid=2;

update tt_stu setname='llll0l'whereid=2 ;

SELECT * FROM tt_stu whereid=2forupdate;

locktable tt_stu insharemode;

因为他们在同一个事物,所以没影响。

行级独占锁和表级独占锁有区别:事物A执行:locktable tt_stu inexclusivemode;这是表独占锁,事物B无法获取该表的共享锁、及任意行的独占锁(也就是意味事物B无法进行增、删、改以及select…for update)。

如果事物A执行:SELECT * FROM tt_stu whereid=2forupdate;仅仅对id=2的数据行添加锁,事物B无法对id=2的数据行添加独占锁以及不能添加共享锁(因为共享锁只能是表级锁,包括id=2的行),但是事物B可以对其他数据行添加独占锁(可以对其他数据行进行修改删除以及执行insert)。

如果事物A执行:insertinto tt_stu values(4,'a');对id=4的数据行获取独占锁,事物B无法获取共享锁以及表独占锁(不可以执行locktable tt_stu insharemode和locktable tt_stu inexclusivemode),但是可以执行任意行独占锁(可以执行任意行insert、update、delte和select for update )。

PS: 普通的select语句无视锁的存在,锁对其没限制。

Oracle的5种表级锁:之前已经使用过了2种表级锁,表共享锁和表独占锁,以及行共享表级锁、行独占表级锁和表共享行独占表级锁。下图给出了表锁与表锁、dml、ddl的关系。

关系图(此处dml仅指增删改及select for update)


表共享:lock table tableNamein share mode;允许其他Session的表共享和行共享表级锁。阻止其他Session 的dml和select for update语句。

表独占:lock table tableNamein exclusive mode;阻止一切锁。阻止其他session的dml和 select for update语句。

行共享表级锁:select for update隐式添加,lock table tableName in row share mode;显式添加。仅允许其他Session获取行共享表级锁、行独占表级锁、表共享和表共享行独占表级锁。允许其他Session的DML和Select for update.

行独占表级锁:dml操作隐式添加,lock table tableName in row exclusivemode 显式添加。仅允许其他Session获取行共享表级锁和行独占表级锁。允许其他Session的DML和Select for update。

表共享行独占锁:lock table in sharerow exclusive mode;添加。仅允许其他Session获取行共享表级锁。阻止其他Session 的dml和select for update语句。

表共享和表独占2种表级锁与行级锁的互斥关系可以用共享锁独占锁分析,也可遵守上图与Dml语句的关系(因为dml除了select都会加行级锁,select for update也会),但是后面3种表级锁与行级锁的关系,只能遵守上图分析,不能直接根据共享锁和独占锁关系判断。

举例:

情况一:

A locktable tt_stu inrowexclusivemode;行共享表级锁

B locktable tt_stu insharerowexclusivemode;表共享行独站表级锁,AB不冲突。

情况二:

A SELECT * FROM tt_stu whereid=2forupdate;行共享表级锁(同情况一)

B locktable tt_stu insharerowexclusivemode;表共享行独站表级锁,AB产生冲突,因为表共享行独占锁会阻塞(ddl操作,和ddl互斥)。

要判断一个表级锁是否会阻塞另外一个表级锁,不仅要看表里的锁兼容性,还要判断是否dml隐式加锁从而判断是否支持dml,要这2个方面都支持才兼容。

PS:分析锁的关系时候,既要考虑表锁上的也要考虑行锁上的兼容性。5种表锁都不允许ddl操作。


扫描二维码获取更多精彩IT技术范


相关推荐

程序员:JDK的安装与配置(完整版)_jdk的安装方法

对于Java程序员来说,jdk是必不陌生的一个词。但怎么安装配置jdk,对新手来说确实头疼的一件事情。我这里以jdk10为例,详细的说明讲解了jdk的安装和配置,如果有不明白的小伙伴可以评论区留言哦下...

Linux中安装jdk并配置环境变量_linux jdk安装教程及环境变量配置

一、通过连接工具登录到Linux(我这里使用的Centos7.6版本)服务器连接工具有很多我就不一一介绍了今天使用比较常用的XShell工具登录成功如下:二、上传jdk安装包到Linux服务器jdk...

麒麟系统安装JAVA JDK教程_麒麟系统配置jdk

检查检查系统是否自带java在麒麟系统桌面空白处,右键“在终端打开”,打开shell对话框输入:java–version查看是否自带java及版本如图所示,系统自带OpenJDK,要先卸载自带JDK...

学习笔记-Linux JDK - 安装&配置

前提条件#检查是否存在JDKrpm-qa|grepjava#删除现存JDKyum-yremovejava*安装OracleJDK不分系统#进入安装文件目...

Linux新手入门系列:Linux下jdk安装配置

本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...

测试员必备:Linux下安装JDK 1.8你必须知道的那些事

1.简介在Oracle收购Sun后,Java的一系列产品就被整合到Oracle官网中,打开官网乍眼一看也不知道去哪里下载,还得一个一个的摸索尝试,而且网上大多数都是一些Oracle收购Sun前,或者就...

Linux 下安装JDK17_linux 安装jdk1.8 yum

一、安装环境操作系统:JDK版本:17二、安装步骤第一步:下载安装包下载Linux环境下的jdk1.8,请去官网(https://www.oracle.com/java/technologies/do...

在Ubuntu系统中安装JDK 17并配置环境变量教程

在Ubuntu系统上安装JDK17并配置环境变量是Java开发环境搭建的重要步骤。JDK17是Oracle提供的长期支持版本,广泛用于开发Java应用程序。以下是详细的步骤,帮助你在Ubuntu系...

如何在 Linux 上安装 Java_linux安装java的步骤

在桌面上拥抱Java应用程序,然后在所有桌面上运行它们。--SethKenlon(作者)无论你运行的是哪种操作系统,通常都有几种安装应用程序的方法。有时你可能会在应用程序商店中找到一个应用程序...

Windows和Linux环境下的JDK安装教程

JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...

linux安装jdk_linux安装jdk软连接

JDK是啥就不用多介绍了哈,外行的人也不会进来看我的博文。依然记得读大学那会,第一次实验课就是在机房安装jdk,编写HelloWorld程序。时光飞逝啊,一下过了十多年了,挣了不少钱,买了跑车,娶了富...

linux安装jdk,全局配置,不同用户不同jdk

jdk1.8安装包链接:https://pan.baidu.com/s/14qBrh6ZpLK04QS8ogCepwg提取码:09zs上传文件解压tar-zxvfjdk-8u152-linux-...

运维大神教你在linux下安装jdk8_linux安装jdk1.7

1.到官网下载适合自己机器的版本。楼主下载的是jdk-8u66-linux-i586.tar.gzhttp://www.oracle.com/technetwork/java/javase/downl...

window和linux安装JDK1.8_linux 安装jdk1.8.tar

Windows安装JDK1.8的步骤:步骤1:下载JDK打开浏览器,找到JDK下载页面https://d.injdk.cn/download/oraclejdk/8在页面中找到并点击“下载...

最全的linux下安装JavaJDK的教程(图文详解)不会安装你来打我?

默认已经有了linux服务器,且有root账号首先检查一下是否已经安装过java的jdk任意位置输入命令:whichjava像我这个已经安装过了,就会提示在哪个位置,你的肯定是找不到。一般我们在...

取消回复欢迎 发表评论: