http://www.cnblogs.com/xpchild/p/3782311.html

 

MySQL的锁:
MySQL内部有很多种类的锁,按照用途不同,可以分为两类:
1. 保护内存结构的锁,实现同步机制
  server层对于线程共享的变量,基本上使用mutex,rwlock来做保护。
  innodb层会增加使用spinlock自旋锁

2. 提供或者保证事务性功能的锁
  server提供了MDL锁,表锁两种锁
  innodb实现行级锁

原子操作:

  在单处理器系统(UniProcessor)结构中,在一个指令周期内完成的都是原子指令,因为硬中断的响应是在每一个cpu指令完成后check的。
而在多处理器结构(Symmetric Multi-Processor)中,要想完成一个原子指令,还需要保证多个core之间的一致性,这里就引入了锁总线的步骤。

例如:x86体系下的cmpxchg指令

下面使用原子指令来实现mutex,rwlock,spinlock的简单伪代码

1. mutex的伪代码:

mutex_lock:
1
2
3
4
5
6
while(1)
  if cmpxchg(*lock,0,1)==0
    success
    break;
  else
    futex(wait)

mutex_unlock:

1
2
3
if cmpxchg(*lock,1,0)==0
  futex(wakeup)
  success

  

2. spinlock的伪代码:

spinlock_lock:

1
2
3
4
5
while(1)
  /* spin */
  if compchg(*lock,0,1)==0
    success
    break

spinlock_unlock:

1
2
if cmpxchg(*lock,1,0)==0
success

  

3. rwlock的伪代码:

/* variables */

1
2
3
4
mutex_lock rw_mutex
int r_cnt;
int w_cnt;
int if_has_w_req;/* 防饿死*/

rwlock_r_lock:

1
2
3
4
5
6
7
8
9
<em>mutex_lock(rw_mutex)
while(1)
  if(!if_has_w_req && w_cnt ==0)
    success
    r_cnt++
    mutex_unlock(rw_mutex)
    return
  else
    futex(wait)</em>

rwlock_r_unlock:

1
2
3
4
mutex_lock(rw_mutex)
r_cnt--;
mutext_unlock(rw_mutex)
fetex(wake_up)

rwlock_w_lock:

1
2
3
4
5
6
7
8
9
10
11
mutex_lock(rw_mutex)
if_has_w_req++
while(1)
  if(r_cnt>0 ||w_cnt >0)
    fetux(wait)
  else
    if_has_w_req--
    success
    w_cnt++;
    break
mutext_unlock(rw_mutex)

rwlock_w_unlock:

1
2
3
mutex_lock(rw_mutex)
w_cnt--
mutex_unlock(rw_mutex)

  

下面通过几篇blog分别介绍一下MySQL事务中的表锁,mdl元数据锁,innodb锁:

另外:关于死锁的讨论,这里先列出需要关注的两点:

1. 内存结构的锁,必须控制加锁的顺序,保证逻辑上不出现死锁
2. 事务锁,在无法保证用户的使用数据库行为的时候,需要死锁检测

附tips:

  在mutex的使用上的一个小tips:

  因为thread如果已经获得了mutex, 那么如果再次lock的话,会产生死锁,要么代码能够控制好,要么可以使用下面的这个结构:

typedef struct my_mutex{
  pthread_mutext_t mutex;
   pthread_t thread;
   unsigned count;
}my_mutex;

在lock之前,使用 mutex_is_owner()来判断是否已经拿到这个mutex了。

bool mutex_is_owner( my_mutex * mutex){
  return pthread_equal(thread_self(), mutex->thread);
}

MySQL锁系列1的更多相关文章

  1. MySQL锁系列3 MDL锁

    http://www.cnblogs.com/xpchild/p/3790139.html   MySQL为了保护数据字典元数据,使用了metadata lock,即MDL锁,保证在并发的情况下,结构 ...

  2. MySQL锁系列2 表锁

    http://www.cnblogs.com/xpchild/p/3789068.html   上一篇介绍了MySQL源码中保护内存结构或变量的锁,这里开始介绍下MySQL事务中的表锁. 注1: 在表 ...

  3. MySQL锁系列之锁的种类和概念

    转自:http://keithlan.github.io/2017/06/05/innodb_locks_1/ 锁是MySQL里面最难理解的知识,但是又无处不在. 一开始接触锁的时候,感觉被各种锁类型 ...

  4. Mysql高手系列 - 第26篇:聊聊如何使用mysql实现分布式锁

    Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 欢迎大家加我微信itsoku一起交流java.算法.数据库相关技术. 这是Mysql系列第26篇. 本篇我们使用my ...

  5. Mysql优化系列(2)--通用化操作梳理

    前面有两篇文章详细介绍了mysql优化举措:Mysql优化系列(0)--总结性梳理Mysql优化系列(1)--Innodb引擎下mysql自身配置优化 下面分类罗列下Mysql性能优化的一些技巧,熟练 ...

  6. Mysql备份系列(4)--lvm-snapshot备份mysql数据(全量+增量)操作记录

    Mysql最常用的三种备份工具分别是mysqldump.Xtrabackup(innobackupex工具).lvm-snapshot快照.前面分别介绍了:Mysql备份系列(1)--备份方案总结性梳 ...

  7. Mysql备份系列(1)--备份方案总结性梳理

    mysql数据库备份有多么重要已不需过多赘述了,废话不多说!以下总结了mysql数据库的几种备份方案: 一.binlog二进制日志通常作为备份的重要资源,所以再说备份方案之前先总结一下binlog日志 ...

  8. Mysql锁机制--并发事务带来的更新丢失问题

    Mysql 系列文章主页 =============== 刚开始学习 Mysql 锁的时候,觉得 Mysql 使用的是行锁,再加上其默认的可重复读的隔离级别,那就应该能够自动解决并发事务更新的问题.可 ...

  9. Mysql锁机制--索引失效导致行锁变表锁

    Mysql 系列文章主页 =============== Tips:在阅读本文前,最好先阅读 这篇(Mysql锁机制--行锁)文章~ 在上篇文章中,我们看到InnoDB默认的行锁可以使得操作不同行时不 ...

随机推荐

  1. <转>ERP的测试用例模板

    1页面部分(1) 页面清单是否完整(是否已经将所需要的页面全部都列出来了)(2) 页面是否显示(在不同分辨率下页面是否存在,在不同浏览器版本中页面是是否显示)(3) 页面在窗口中的显示是否正确.美观( ...

  2. 为Fitnesse-20140630定制RestFixture代码

    摘要:Fitnesse插件RestFixture在最新版Fitnesse输出测试结果为html文本,而非html.本博文记录RestFixture定制代码的过程. 准备开发环境 假定你已经正确安装JD ...

  3. 学习笔记——XSLT转换器的使用(Xalan和Saxon) .(转)

    转自:http://blog.csdn.net/crystalbruce/article/details/7401602 XSLT分为两类: 1:客户端转换:需要浏览器的支持. 2:服务器转换:需要使 ...

  4. 解决虚拟机ssh连接出错connection refused

    在安装操作系统之后,使用ssh连接,发现直接报错connection refused. 检查虚拟机的连接方式,在使用host only的方式的时候,必须接入网线,不然的网卡是不活动的,从而不能使用ss ...

  5. CSS快速制作图片轮播的焦点

    来源:http://www.ido321.com/858.html 效果图: 演示地址:http://jsfiddle.net/Web_Code/q5qfd8aL/embedded/result/ 代 ...

  6. 恒天云 3.0:打造基于OpenStack的私有云新模式

    摘自恒天云官网:http://www.hengtianyun.com/download-show-id-17.html 云计算在当今IT世界中已发展地如火如荼,越来越多的企业利用云计算改造传统的数据中 ...

  7. windows下编译支持https的libcurl

    本文参考http://blog.csdn.net/fragmentalice/article/details/39430293特此感谢.公司项目中用到几个http get请求,用的libcurl开源库 ...

  8. 第二百六十五天 how can I 坚持

    每天上班闲着没事干好蛋疼啊.周报都不知道怎么写了. 今天加上了毕梦琪,哎,不知咋聊.好烦. 要搞angelarjs了,希望有机会,多搞点东西,要当架构师,哈哈. 量子计算,什么高深的东西,百度百科了下 ...

  9. cocos2d-x获得系统的语言

    获得手机系统的语言 CCSize winSize = CCDirector::sharedDirector()->getWinSize(); CCLabelTTF *label = CCLabe ...

  10. New full duplex HTTP tunnel implementation (client and server)

    https://issues.jboss.org/browse/NETTY-246?page=com.atlassian.jirafisheyeplugin:fisheye-issuepanel —— ...