[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[备忘]mysql的innodb加锁

上一篇:[备忘]mysql的innodb锁等待时间
下一篇:[备忘]innodb查看锁

添加日期:2016/1/25 9:45:20 快速返回   返回列表 阅读2084次
概述:
(1)普通的select都是快照查询,不加锁
(2)insert加gap锁,update和delete根据条件,
<1>不走索引,则全表扫描,符合条件的记录都加锁(主键索引上加锁)
<2>走索引,则索引上符合条件的记录加锁,如果不是主键索引,则在对应的主键索引上也加锁。

死锁发生:
<1>两个地方,加锁顺序相反,导致互相锁死。
<2>一个地方,或多个地方,给记录加锁顺序相反,互相锁死。
如一个sql给1,3记录加锁,另一个sql给3,1记录加锁,互相锁死。
如前者走主键索引,符合条件的记录是1和3,顺序加锁。
后者走其他索引,也要给主键索引上锁,顺序是3和1,互相锁死。
----------------------------
(1)InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

(2)由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的。应用设计的时候要注意这一点。

(3)当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,另外,不论是使用主键索引、唯一索引或普通索引,InnoDB都会使用行锁来对数据加锁。

(4)即便在条件中使用了索引字段,但是否使用索引来检索数据是由MySQL通过判断不同执行计划的代价来决定的,如果MySQL认为全表扫描效率更高,比如对一些很小的表,它就不会使用索引,这种情况下InnoDB将使用表锁,而不是行锁。因此,在分析锁冲突时,别忘了检查SQL的执行计划,以确认是否真正使用了索引。关于MySQL在什么情况下不使用索引的详细讨论,参见本章“索引问题”一节的介绍。

另一个好文,很详细。
mysql事务和锁InnoDB
http://www.cnblogs.com/zhaoyl/p/4121010.html
 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved