对比Oracle和Mysql在锁机制上的类似和差异点

转:https://blog.csdn.net/c332472988/article/details/52804078

InnoDB行锁实现方式
InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

在进一步分析Hadoop相关的分布式事务和锁的机制前,有必要先整理和对比分析一下RDBMS领域最红的两大领军人物

Oracle VS Mysql

1:事务隔离级别

oracle默认为Read committed

Mysql的InnoDB默认为Repeatable Read.

2:锁类别

oracle

内部级封锁(对外不公布,无法了解)

DDL锁(对数据字典、词法分析封锁)

细分:(1)、字典操作锁:用于对字典操作时,锁住数据字典,此封锁是独占的,从而保护任何一个时刻仅能对一个字典操作。 
   (2)、字典定义锁:用于防止在进行字典操作时又进行语法分析,这样可以避免在查询字典的同时改动某个表的结构。 
   (3)、表定义锁:用于 一个 SQL 语句正当访问某个表时,防止字典中与该表有关的项目被修改。 

DML锁(对数据控制操作进行锁定)

细分包括:

 (1)共享锁 (2)独占锁 (3)共享更新锁

另外:Oracle的所在另外一个层面还可以划分为两大类

悲观锁:

锁在用户修改之前就发挥作用: 
Select ..for update ( nowait) 
Select * from tab1 for update 
乐观锁:

乐观的认为数据在 select 出来到 update 进取并提交的这段时间数据不会被更改。这里面有一种潜在的危险就是由于被选出的结果集并没有被锁定,是存在一种可能被其他用户更改的可能。因此Oracle 仍然建议是用悲观封锁,因为这样会更安全。

myql

表级锁定(系统缺省,MyISAM,Memory,CSV)

   分为:读锁、写锁

行级锁定(InnoDB,NDB Cluster)

   独占锁、共享锁、意向独占锁、意向共享锁,InnoDB由于实现机制方式,具有【间隙锁】

页级锁定(Berkeley DB)

 

上述所的开销如何呢,对应的适合场景如何?

规则:

1:锁的对象粒度跟并行度成反比

2:所得粒度大小跟所需的成本成反比

所以可以基本得出:

a:独占锁更安全,但是并发性低

b:乐观锁,支持并发更高,但是需要业务来适应锁出现的问题

c:行锁粒度更小,支持更小的并发性,但是对应的资源消耗也必将高

 

注意Oracle的锁机制跟Mysql的类似点

 DML 锁的三种封锁方式: 
( 1 )、共享封锁方式( SHARE ) 
( 2 )、独占封锁方式( EXCLUSIVE ) 
( 3 )、共享更新封锁( SHARE UPDATE ) 
其中 SHARE , EXCLUSIVE 用于表封锁, SHARE UPDATE 用于行封锁。 

注意:在Mysql中

共享锁在行级别上应该也可以支持

独占锁在列上也应该可以支持

 

另外一点:Oracle需要区分另外几类锁的规则:

Oracle的TX锁(行级锁、事务锁)
TX的本义是Transaction(事务),当一个事务第一次执行数据更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE语句进行查询时,它即获得一个TX(事务)锁,直至该事务结束(执行COMMIT或ROLLBACK操作)时,该锁才被释放。所以,一个TX锁,可以对应多个被该事务锁定的数据行。

TM锁(表级锁)

意向锁:
表是由行组成的,当我们向某个表加锁时,一方面需要检查该锁的申请是否与原有的表级锁相容;

另一方面,还要检查该锁是否与表中的每一行上的锁相容。

比如一个事务要在一个表上加S锁,如果表中的一行已被另外的事务加了X锁,那么该锁的申请也应被阻塞。

如果表中的数据很多,逐行检查锁标志的开销将很大,系统的性能将会受到影响。

为了解决这个问题,可以在表级引入新的锁类型来表示其所属行的加锁情况,这就引出了“意向锁”的概念。
意向锁的含义是如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对它的上层结点加意向锁。

如:对表中的任一行加锁时,必须先对它所在的表加意向锁,然后再对该行加锁。这样一来,事务对表加锁时,就不再需要检查表中每行记录的锁标志位了,系统效率得以大大提高。

 

意向锁的类型:
由两种基本的锁类型(S锁、X锁),可以自然地派生出两种意向锁:
意向共享锁(Intent Share Lock,简称IS锁):如果要对一个数据库对象加S锁,首先要对其上级结点加IS锁,表示它的后裔结点拟(意向)加S锁;
意向排它锁(Intent Exclusive Lock,简称IX锁):如果要对一个数据库对象加X锁,首先要对其上级结点加IX锁,表示它的后裔结点拟(意向)加X锁。

基本的锁类型(S、X)与意向锁类型(IS、IX)之间还可以组合出新的锁类型,理论上可以组合出4种,

即:S+IS,S+IX,X+IS,X+IX,但稍加分析不难看出,实际上只有S+IX有新的意义,其它三种组合都没有使锁的强度得到提高(即:S+IS=S,X+IS=X,X+IX=X,这里的“=”指锁的强度相同)。所谓锁的强度是指对其它锁的排斥程度。

共享意向排它锁(Shared Intent Exclusive Lock,简称SIX锁) :如果对一个数据库对象加SIX锁,表示对它加S锁,再加IX锁,即SIX=S+IX。例如:事务对某个表加SIX锁,则表示该事务要读整个表(所以要对该表加S锁),同时会更新个别行(所以要对该表加IX锁)。

 

貌似看起来比较乱,差异就在于两者对锁的实现具体技术和设计理念的差异:

Oracle对锁的设计更加极致和全面,实现技术方面更加全面,但是不公开细节

Mysql明确支持2到3种,而且不同的存储引擎各有所专场,虽然不如oracle的全面,但是灵活运用还是可以满足需要,并且可能超出想象。

 

 查看锁的方式:

oracle:
1.查哪个过程被锁
查V$DB_OBJECT_CACHE视图:
SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER=''过程的所属用户'' AND LOCKS!=''0'';

2. 查是哪一个SID,通过SID可知道是哪个SESSION.
查V$ACCESS视图:
SELECT * FROM V$ACCESS WHERE OWNER=''过程的所属用户'' AND NAME=''刚才查到的过程名

 

mysql:

MyISAM的查看机制

table_locks_immediated和table_locks_waited.

InnoDB的

innodb_row_lock_current_waits

innodb_row_lock_time

innodb_row_lock_time_avg

innodb_row_lock_time_max

innodb_row_lock_waits

 

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

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

相关文章

BUUOJ reverse 刮开有奖

刮开有奖 这是一个赌博程序,快去赚钱吧!!!!!!!!!!!!!!!!!&…

正则表达式测试工具

这个工具最开始是年前写的,原文见如下地址:写了一个测试正则表达式的小工具 后来快过年的时候一直忙着给票贩子送钱去了,没有把它写完,今天抽空把一些细节的功能完成了一下,感兴趣的朋友可以下载试用:点击…

快速排序的原理以及Java代码

package com.asiainfo.test;import java.util.Arrays;import sun.misc.Sort;public class QKSORT {//基本思路是:选择一个值为key 一般是选择左边第一个为key//先是从右向左找到小于 key 的值 将此值与 key 进行交换,由于key 是一个标记先不用交换 &…

BUUOJ reverse 不一样的flag

不一样的flag 是不是做习惯了常规的逆向题目?试试这道题,看你在能不能在程序中找到真正的flag!注意:flag并非是flag{XXX}形式,就是一个’字符串‘,考验眼力的时候到了! 注意:得到的 …

shiro学习(18):使用注解实现权限认证和后台管理三

工具idea 先看看数据库 shiro_role_permission 数据 shiro_user shiro_user_role 数据 目录结构 在pom.xml里面添加 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http…

摇篮与家园

今天你从你出生的医院回到家里&#xff0c;终于和爸爸妈妈团圆了。   说你"回"到家里&#xff0c;似不确切&#xff0c;因为你是第一次来到这个家。   不对&#xff0c;应该说&#xff0c;你来了&#xff0c;我们才第一次有了一个家。   孩子是使家成其为家的根…

Java中的锁分类

转:http://www.cnblogs.com/qifengshi/p/6831055.html 在读很多并发文章中&#xff0c;会提及各种各样锁如公平锁&#xff0c;乐观锁等等&#xff0c;这篇文章介绍各种锁的分类。介绍的内容如下&#xff1a; 公平锁/非公平锁可重入锁独享锁/共享锁互斥锁/读写锁乐观锁/悲观锁…

shiro学习(19): 拦截器

1 拦截器介绍 Shiro使用了与Servlet一样的Filter接口进行扩展&#xff1b;所以如果对Filter不熟悉可以参考《Servlet3.1规范》http://www.iteye.com/blogs/subjects/Servlet-3-1了解Filter的工作原理。首先下图是Shiro拦截器的基础类图&#xff1a; 1、NameableFilter Name…

关于云开发新服务“实时数据推送”,你需要了解的全在这了!

“微信小程序工程师邓坤力带你了解如何利用千呼万唤始出来的云开发实时数据推送服务打造生动的小程序和小游戏&#xff01;” 在数据库在小程序云开发中的应用一文中&#xff0c;我们了解到实时数据推送作为云开发即将上线的一项新能力&#xff0c;主要指客户端使用官方SDK发起…

MFC窗体“抽筋”

碰到的这个问题不知道用怎样的词去表达。能反映在屏幕上的就是MFC的窗体不能正常的进入&#xff0c;双击图标后&#xff0c;窗体死在那边&#xff0c;进而程序挂掉。在挂掉之前&#xff0c;窗体是不停的闪烁&#xff0c;就像抽筋一样。 产生问题的背景和条件&#xff1a; 1&…

java实现二分查找-两种方式

转:https://blog.csdn.net/maoyuanming0806/article/details/78176957 二分查找是一种查询效率非常高的查找算法。又称折半查找。 起初在数据结构中学习递归时实现二分查找&#xff0c;实际上不用递归也可以实现&#xff0c;毕竟递归是需要开辟额外的空间的来辅助查询。本文就…

shiro学习(20): 自定义过滤规则

工具idea 先看看数据库 shiro_role_permission 数据 shiro_user shiro_user_role 数据 目录结构 在pom.xml里面添加 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http…

css 一些 常用布局

div骨架 Code<div id"header">ss</div> <div id"container"> <div id"content">ss</div> <div id"side">ss</div> </div> <div id"pagefooter"…

BUUOJ reverse SimpleRev (爆破)

SimpleRev SimpleRev(flag需加上flag{}再提交) 注意&#xff1a;得到的 flag 请包上 flag{} 提交 拖到ida 找到关键函数&#xff1a; unsigned __int64 Decry() {char v1; // [rspFh] [rbp-51h]int v2; // [rsp10h] [rbp-50h]int v3; // [rsp14h] [rbp-4Ch]int i; // [rsp18h] …

抽象类和接口的对比

转:http://www.importnew.com/12399.html 参数抽象类接口默认的方法实现它可以有默认的方法实现接口完全是抽象的。它根本不存在方法的实现实现子类使用extends关键字来继承抽象类。如果子类不是抽象类的话&#xff0c;它需要提供抽象类中所有声明的方法的实现。子类使用关键字…

shiro学习(21):动态添加验证规则1

工具idea 先看看数据库 shiro_role_permission 数据 shiro_user shiro_user_role 数据 目录结构 在pom.xml里面添加 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http…

SCOPE_IDENTITY和@@identity的区别

SCOPE_IDENTITY、IDENT_CURRENT 和 IDENTITY 是相似的函数&#xff0c;因为它们都返回插入到标识列中的值。 IDENT_CURRENT 不受作用域和会话的限制&#xff0c;而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。调用它时必须提供表示表名的字符…

HDU 1203 I NEED A OFFER! (动态规划、01背包、概率)

I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 40874 Accepted Submission(s): 16228 Problem Description Speakless很早就想出国&#xff0c;现在他已经考完了所有需要的考试&#xff0c;准…

索引原理及项目中如何使用索引实例分析

一.索引原理&#xff1a; 为认识索引工作原理&#xff0c;首先有必要对数据表的基本结构作一次全面的复习。 当一个新表被创建之时&#xff0c;系统将在磁盘中分配一段以8K为单位的连续空间&#xff0c;当字段的值从内存写入磁盘时&#xff0c;就在这一既定空间随机保存&#x…

shiro学习(22):动态添加验证规则2

工具idea 先看看数据库 shiro_role_permission 数据 shiro_user shiro_user_role 数据 目录结构 在pom.xml里面添加 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http…