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. 把十进制整数转换为r(r=2)进制输出(顺序栈实现)

    上周的第二个作业补上~~ 上周的要求: 1.给出顺序栈的存储结构定义. 2.完成顺序栈的基本操作函数. 1)      初始化顺序栈 2)      实现入栈和出栈操作 3)      实现取栈顶元素 ...

  2. HDU分类

    原地址:http://www.byywee.com/page/M0/S607/607452.html 总结了一下ACM STEPS的各章内容,趁便附上我的Steps题号(每人的不一样). 别的,此文首 ...

  3. platform_driver_register()--如何match之后调用probe

    int platform_driver_register(struct platform_driver *drv) { drv->driver.bus = &platform_bus_t ...

  4. C++ 实现设计模式之观察者模式

    1. 什么是观察者模式? 观察者模式(有时又被称为发布-订阅Subscribe>模式.模型-视图View>模式.源-收听者Listener>模式或从属者模式)是软件设计模式的一种.在 ...

  5. 一名IT从业者的英语口语能力成长路径

    一名IT从业者的英语口语能力成长路径 来源: 微信公众号  发布时间: 2014-03-12 22:53  阅读: 6134 次  推荐: 24   原文链接   [收藏]   这篇文章是我最近十天口 ...

  6. Kinetic使用注意点--animation

    new Animation(func, layers) 参数: func:每一帧都会调用一次此函数.此函数接收一个包含四个元素的参数对象,时间单位均为毫秒. { timeDiff:"上一帧和 ...

  7. C#运算符之与,或,异或及移位运算

    C#运算符之与,或,异或及移位运算 1.剖析异或运算(^) 二元 ^ 运算符是为整型和 bool 类型预定义的.对于整型,^ 将计算操作数的按位“异或”.对于 bool 操作数,^ 将计算操作数的逻辑 ...

  8. Linux私房菜——防火墙部分笔记

    #1 分类 对单一主机,主要有两种:数据包过滤Netfilter和依据服务软件分析的TCP Wrapper. 对区域型防火墙来说,即安装防火墙的主机充当路由器的角色.防火墙类型主要有两种:数据包过滤N ...

  9. cf Round 601

    A.The Two Routes(BFS) 给出n个城镇,有m条铁路,铁路的补图是公路,汽车和火车同时从1出发,通过每条路的时间为1,不能同时到达除了1和n的其它点,问他们到达n点最少要用多长时间. ...

  10. python 操作sqlite数据库

    '''SQLite数据库是一款非常小巧的嵌入式开源数据库软件,也就是说 没有独立的维护进程,所有的维护都来自于程序本身. 在python中,使用sqlite3创建数据库的连接,当我们指定的数据库文件不 ...