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. update语句

    [update cicm.cicmodt0702 set msgbody = :1 where msgid between :2 and :3         ] [update cicm.cicmo ...

  2. 怎么在aspx里面添加swf文件

    <OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codeBase="http://down ...

  3. 点击按钮文字变成input框,点击保存变成文字

    <!DOCTYPE html><html lang="en"> <head> <meta http-equiv="Content ...

  4. Transaction的理解

    Transaction的理解   待完善......

  5. 怎样用sourceTree将自己本地的项目上传到github网站上

    前言:GitHub 是基于 Git 的一个代码托管网站.开发者可以将代码在 GitHub 上开源,可以浏览其它项目的代码. 准备工作:1.github网站账号.2.sourceTree软件. 一.在g ...

  6. logback使用笔记

    三大主要元素 looger:记录日志 appender:输出目的地 layout:输出格式 必要步骤: 一.引入包: import org.slf4j.Logger; import org.slf4j ...

  7. [转]LoadRunner脚本录制常见问题整理

    LoadRunner脚本录制常见问题整理 1.LoadRunner录制脚本时为什么不弹出IE浏览器? 当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面 ...

  8. Python复杂多重排序

    1. cmp函数是python自带的函数,用于比较两个参数哪个大哪个小 print cmp(2, 3) # -1 如果第一个参数比第二个小,就返回-1,两个元素相等,返回0,否则返回1 2.所以就可以 ...

  9. Python设计模式——观察者模式

    需求:员工上班在偷偷看股票,拜托前台一旦老板进来,就通知他们,让他们停止看股票. 这里有两类人,一类是观察者,即员工,一类是通知者,即前台,员工在观察前台的状态,前台负责通知员工最新的动态. #enc ...

  10. Bootstrap 与 ASP.NET MVC 4 不使用 NuGet Package 笔记

    转自 http://www.mytecbits.com/microsoft/dot-net/bootstrap-with-asp-net-mvc-4-step-by-step 单位最近做了一个Boot ...