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. indeed 第二次笔试题

    1. Maximal Values 很简单,从前往后扫,找满足的,O(n),很容易就过掉了. maxn = 100. 没啥难点. 2. Bi-gram 用map统计个数,从前往后扫,每2个字符作为一个 ...

  2. Executors 构建线程池

    Executors包含一系列静态方法,可以用于构建线程池. 返回实现了 ExecutorService 接口的对象: newCachedThreadPool newFixedThreadPool(in ...

  3. 转载 shell sort

    http://blog.sina.com.cn/s/blog_6d09b5750100x6zg.html 首先是shell排序实现多列排序,这里添加竖线以作分割,如下文件test: a|gggg|4| ...

  4. JSON Date Format/JSON 日期格式方法分享

    我是很懒的,不想多说,所以直接上代码.亲们懂的. <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://w ...

  5. switch...case 和 if...else

    switch...case与if...else的根本区别在于: switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的,switc ...

  6. JavaScript自定义方法实现trim()、Ltrim()、Rtrim()

    去除字符串两端的空格,是字符串处理非常常用的方法如何trim() .Ltrim() .Rtrim(),可惜的是javascript中无此方法,下面有个不错的自定义教程感兴趣的朋友可以参考下 去除字符串 ...

  7. Websocket协议之握手连接

    Websocket协议是为了解决web即时应用中服务器与客户端浏览器全双工通信的问题而设计的,是完全意义上的Web应用端的双向通信技术,可以取代之前使用半双工HTTP协议而模拟全双工通信,同时克服了带 ...

  8. 伪装隐藏Nginx,PHP版本号提升服务器安全性

    可能有时候我们看某些站点想知道别人在使用什么版本的web服务器之类的信息时,却发现并未显示版本号,甚至连WEB服务器都有变化,可以通过以下 方法来隐藏Nginx.PHP的版本号信息,来提升一定的安全性 ...

  9. about building flying sauser

    download flying sauser: unzip flyingsaucer-master.zip cd flyingsaucer-master/ mvn install

  10. hdu 3591 The trouble of Xiaoqian

    hdu 3591  The trouble of Xiaoqian 题意:xiaoqi要买一个T元的东西,当前的货币有N种,xiaoqi对于每种货币有Ci个:题中定义了最小数量即xiaoqi拿去买东西 ...