MySQL锁系列1
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)==0success |
3. rwlock的伪代码:
/* variables */
|
1
2
3
4
|
mutex_lock rw_mutexint 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++; breakmutext_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的更多相关文章
- MySQL锁系列3 MDL锁
http://www.cnblogs.com/xpchild/p/3790139.html MySQL为了保护数据字典元数据,使用了metadata lock,即MDL锁,保证在并发的情况下,结构 ...
- MySQL锁系列2 表锁
http://www.cnblogs.com/xpchild/p/3789068.html 上一篇介绍了MySQL源码中保护内存结构或变量的锁,这里开始介绍下MySQL事务中的表锁. 注1: 在表 ...
- MySQL锁系列之锁的种类和概念
转自:http://keithlan.github.io/2017/06/05/innodb_locks_1/ 锁是MySQL里面最难理解的知识,但是又无处不在. 一开始接触锁的时候,感觉被各种锁类型 ...
- Mysql高手系列 - 第26篇:聊聊如何使用mysql实现分布式锁
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 欢迎大家加我微信itsoku一起交流java.算法.数据库相关技术. 这是Mysql系列第26篇. 本篇我们使用my ...
- Mysql优化系列(2)--通用化操作梳理
前面有两篇文章详细介绍了mysql优化举措:Mysql优化系列(0)--总结性梳理Mysql优化系列(1)--Innodb引擎下mysql自身配置优化 下面分类罗列下Mysql性能优化的一些技巧,熟练 ...
- Mysql备份系列(4)--lvm-snapshot备份mysql数据(全量+增量)操作记录
Mysql最常用的三种备份工具分别是mysqldump.Xtrabackup(innobackupex工具).lvm-snapshot快照.前面分别介绍了:Mysql备份系列(1)--备份方案总结性梳 ...
- Mysql备份系列(1)--备份方案总结性梳理
mysql数据库备份有多么重要已不需过多赘述了,废话不多说!以下总结了mysql数据库的几种备份方案: 一.binlog二进制日志通常作为备份的重要资源,所以再说备份方案之前先总结一下binlog日志 ...
- Mysql锁机制--并发事务带来的更新丢失问题
Mysql 系列文章主页 =============== 刚开始学习 Mysql 锁的时候,觉得 Mysql 使用的是行锁,再加上其默认的可重复读的隔离级别,那就应该能够自动解决并发事务更新的问题.可 ...
- Mysql锁机制--索引失效导致行锁变表锁
Mysql 系列文章主页 =============== Tips:在阅读本文前,最好先阅读 这篇(Mysql锁机制--行锁)文章~ 在上篇文章中,我们看到InnoDB默认的行锁可以使得操作不同行时不 ...
随机推荐
- Headmaster's Headache
题意: s门课程,现任老师有m个给出工资,和他们能教的课,现在有n个应聘的老师,给出费用和能教的课程标号,求使每门课都至少有两个老师教的最小花费 分析: n个老师选或不选有背包的特征,n很小想到用状压 ...
- Oracle中表结构和表内容复制
处理该问题注意以下几点: 1. 清空表中数据SQL:truncate table table_name; 2.复制表结构SQL:create table table_name1 as select * ...
- CMDB反思1
由于,基本已经完成一期的功能开发,所以要继续CMDB的开发工作了. 最近看了不少CMDB相关的文章,也思考了不少,后面将所思所想(比较浅)记录一下. 发现很多内容都记录在Wiz上,抽空整理到博客中. ...
- 关于jQuery中,animate、slide、fade等动画的连续触发、滞后反复执行的bug的个人解决办法
照例,现在开头讲个这个问题发生的背景吧: 因为最近要做个操作选项的呼出,然后就想到了用默认隐藏,鼠标划过的时候显示的方法. 刚开始打算添加一个class="active",直接触发 ...
- Tkinter教程之Scrollbar篇
本文转载自:http://blog.csdn.net/jcodeer/article/details/1811319 '''Tkinter教程之Scrollbar篇'''#Scrollbar(滚动条) ...
- [Hive - LanguageManual ] Windowing and Analytics Functions (待)
LanguageManual WindowingAndAnalytics Skip to end of metadata Added by Lefty Leverenz, last edi ...
- 转】Nginx+tomcat集群环境搭建(Windows下)
原博文出自于: http://blog.csdn.net/clj198606061111/article/details/22621003 感谢! 实验环境 windows xp s ...
- (转载)Linux启动过程详解
启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬盘 ...
- 设置VMWARE通过桥接方式使用主机网卡上网
1 Host-only连接方式 让虚机具有与宿主机不同的各自独立IP地址,但与宿主机位于不同网段,同时为宿主主机新增一个IP地址,且保证该IP地址与各虚机IP地址位于同一网段.最终结果是新建了一个由 ...
- UVA10361 - Automatic Poetry
“Oh God”, Lara Croft exclaims, “it’s one of these dumb riddles again!” In Tomb Raider XIV, Lara is, ...