row代表lock HashTable的权限
column代表预加锁的权限 
 
ulint
lock_mode_stronger_or_eq(
/*=====================*/
enum lock_mode mode1, /*!< in: lock mode */ //找到的lock本身锁的模式
enum lock_mode mode2) /*!< in: lock mode */ //预加锁的模式
{
ut_ad(mode1 == LOCK_X || mode1 == LOCK_S || mode1 == LOCK_IX
|| mode1 == LOCK_IS || mode1 == LOCK_AUTO_INC);
ut_ad(mode2 == LOCK_X || mode2 == LOCK_S || mode2 == LOCK_IX
|| mode2 == LOCK_IS || mode2 == LOCK_AUTO_INC); return((LOCK_MODE_STRONGER_OR_EQ) & LK(mode1, mode2));
}
     
     IS  IX  S   X  AI
IS  +   -    -   -   -
IX  +  +    -   -   -
S   +   -   +   -   -
X   +  +   +  +  +
AI  -    -    -   -  +
 
Innodb的锁分基础锁和精准锁
IS  意向共享锁 只针对于 表
IX  意向排它锁 只针对于 表
S   共享锁        针对于 表、记录
X   排它锁        针对于 表、记录
 
+ 代表row锁的强度>=column锁
 
/////////////////////////////////////////////////////////////////////////////////////////////////////
 
#define LOCK_MODE_STRONGER_OR_EQ 0
这里的 0 是int类型,占4(字节)*8(位)=32位,即下标从0到31
 
#define LK(a,b) (1 << ((a) * LOCK_NUM + (b)))
这个宏里LOCK_NUM 为6,不是5
之所以为6,是要保证LK()的结果 不能超过31,同时保证为最大的数,我想应该是避免冲突吧
 
例如, 使用 LOCK_AUTO_INC 为 4,如果 LOCK_NUM 为5的话
1<<(4*5+4)=2^24  
可理解为数字 1 左移24位
 
如果 LOCK_NUM 为6
1 << (4*6+4) = 2^28 
可理解为数字 1 左移 28位
 
LOCK_NUM 大于6就不行了,例如
1<<(4*7+4)=2^32  
可理解为 数字 1 左移 32位,超过int 类型最大下标 31 了, 会溢出的 
 
即 #define LK(a,b) (1 << ((a) * 6 + (b)))
 
/////////////////////////////////////////////////////////////////////////////////////////////////////
 
#define LOCK_MODE_STRONGER_OR_EQ 0 \
 | LK(LOCK_IS, LOCK_IS) \
 | LK(LOCK_IX, LOCK_IS) | LK(LOCK_IX, LOCK_IX) \
 | LK(LOCK_S, LOCK_IS) | LK(LOCK_S, LOCK_S) \
 | LK(LOCK_AUTO_INC, LOCK_AUTO_INC) \
 | LK(LOCK_X, LOCK_IS) | LK(LOCK_X, LOCK_IX) | LK(LOCK_X, LOCK_S) \
 | LK(LOCK_X, LOCK_AUTO_INC) | LK(LOCK_X, LOCK_X)
 
 这个宏里每一个LK(a,b)就代表了row锁的强度>=column锁 这个 组合 在32位中的下标
 
当这些组合经过 | 或运算,组成一个int类型的数字
那么当要检查某个组合是否是强度大的锁组合时,只需要跟上面的数 进行 & 与运算(全1为1,其他为0)即可
 
 
 
 
 

函数lock_mode_stronger_or_eq 锁权限等级的更多相关文章

  1. JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制

    JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...

  2. JAVA之旅(十三)——线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this

    JAVA之旅(十三)--线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this 我们继续上个篇幅接着讲线程的知识点 一.线程的安全性 当我们开启四个窗口(线程 ...

  3. mysql 查询表死锁 和结束死锁的表步骤以及锁表等级

    1.查询是否锁表show OPEN TABLES where In_use > 0; 2.查询进程 show processlist  查询到相对应的进程===然后 kill    id 补充: ...

  4. ArcEngine中License权限等级更改的问题

    曾经认为自己对于ArcGIS 开发许可问题比较理解了,并小结在<ArcEngine10.x开发的许可问题>中. 01.权限问题 今天在调用GP时失败(插值式开发,使用的是他人框架),因为需 ...

  5. 多线程---静态同步函数的锁是class(转载)

    /** 如果同步函数被静态修饰,那么他的锁就是该方法所在类的字节码文件对象 类名.class 静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象. 该对象就是:类名.class   ...

  6. 多线程---同步函数的锁是this(转载)

    class Ticket implements Runnable { private int tick = 100; Object obj = new Object(); boolean flag = ...

  7. oracle中把函数的执行权限赋个某个用户

    赋权:grant execute on function1 to ucr_dtb1;收回执行权限:revoke execute on function1 from ucr_dtb1; 在ucr_dtb ...

  8. MySQL创建存储过程/函数需要的权限

    alter routine---修改与删除存储过程/函数 create routine--创建存储过程/函数 execute--调用存储过程/函数 下面有一篇介绍MySQL所有权限的博文 http:/ ...

  9. Oracle 锁的等级

    ORACLE里锁有以下几种模式: 0:none 1:null 空 2:Row-S 行共享(RS):共享表锁,sub share 3:Row-X 行独占(RX):用于行的修改,sub exclusive ...

随机推荐

  1. Codevs 1069 关押罪犯 2010年NOIP全国联赛提高组

    1069 关押罪犯 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description S 城现有两座监狱,一共 ...

  2. springmvc学习(一)helloworld实例

    今天介绍的是springmvc的学习,越来越多的企业开始选择springmvc+mybatis来构建系统架构,在电商热门的今天,springmvc+mybatis已成为电商项目架构的很好搭配.Spri ...

  3. 学习C++ Primer 的个人理解(六)

    第四章和第五章没什么特别的.基本上就是书本上的字面意思,也没什么需要注意的细节.直接记录第六章. 本章介绍了函数,其实也没什么特别的.但有几个重点 1.形参的类型决定了形参和实参的交互方式.形参是引用 ...

  4. strcpy函数导致release版程序崩溃

    最近在写一个读取模型文件的小程序.很随意的使用了strcpy函数进行char字符数组的拷贝,这个数组是需要传递给PostMessage作为WPARAM的参数.代码部分如下: char pStrCurr ...

  5. 第28条:利用有限制通配符来提升API的灵活性

    参数化类型是不可变的.对两个不同类型T1和T2而言,List<T1>与List<T2>没有父子类型关系. 考虑: public class Stack<E> { p ...

  6. NFS vs. CIFS

    1.  CIFS协议分析 CIFS(Common Internet File System,公共互联网文件系统)是当前主流异构平台共享文件系统之一.主要应用在NT/Windows环境下,是由Micro ...

  7. Linux C 程序 函数,数组,指针,gdb调试器(SEVEN)

    函数,数组,指针,gdb调试器 1.函数定义 如果明确指定返回类型,默认为int 参数传递:实参对形参的参数传递是单向的,实参只是把自己的值赋给形参.                      形参的 ...

  8. animation css3动画与CSS3 @keyframes担配使用创建往复平缓动画

    通过 @keyframes 规则,您能够创建动画. 创建动画的原理是,将一套 CSS 样式逐渐变化为另一套样式. 在动画过程中,您能够多次改变这套 CSS 样式. 以百分比来规定改变发生的时间,或者通 ...

  9. prefixfree.js介绍

    假如你现在正学习着强大的Css3,你知道Css3的很多数属性为实验属性,使用他们的时候得加上各式各样的浏览器前缀.可能你默默忍受了,因为还没到统一的时间.有没想过给自己减下负,偶然间在网上看到一个js ...

  10. dataTable 禁止排序

    $("#id").DataTable({ "ordering": false, // 禁止排序 });