查看: 6780|回复: 13

【大话IT】innodb query何时使用行锁

[复制链接]
论坛徽章:
10
2011新春纪念徽章
日期:2011-02-18 11:43:342015年新春福章
日期:2015-03-06 11:58:18懒羊羊
日期:2015-03-04 14:52:11马上有钱
日期:2014-02-18 16:43:092014年新春福章
日期:2014-02-18 16:43:09优秀写手
日期:2013-12-18 09:29:11三菱
日期:2013-08-30 20:37:412013年新春福章
日期:2013-02-25 14:51:24ITPUB十周年纪念徽章
日期:2011-11-01 16:24:51暖羊羊
日期:2015-06-22 15:51:36
跳转到指定楼层
1#
发表于 2015-3-4 11:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
CREATETABLE t (a INT NOT NULL, b INT) ENGINE = InnoDB;
INSERTINTO t VALUES (1,2),(2,3),(3,2),(4,3),(5,2);
COMMIT;

会话1
SETautocommit = 0;
UPDATEt SET b = 5 WHERE b = 3;
会话2
SETautocommit = 0;
UPDATEt SET b = 4 WHERE b = 2;

问题:
1 会话1使用的是行锁还是表锁,会阻塞会话2么?
2 如果会话1仍能使用行锁,那么Innodb判断使用行锁或表锁的标准是什么?

论坛徽章:
3
懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18蒙奇·D·路飞
日期:2017-09-21 11:23:37
2#
发表于 2015-3-5 14:22 | 只看该作者
本帖最后由 lujinke 于 2015-3-5 14:23 编辑

MySQL的行锁是通过对索引加锁来实现,如果没有索引,就需要全表扫描,会锁住整个表

使用道具 举报

回复
论坛徽章:
10
2011新春纪念徽章
日期:2011-02-18 11:43:342015年新春福章
日期:2015-03-06 11:58:18懒羊羊
日期:2015-03-04 14:52:11马上有钱
日期:2014-02-18 16:43:092014年新春福章
日期:2014-02-18 16:43:09优秀写手
日期:2013-12-18 09:29:11三菱
日期:2013-08-30 20:37:412013年新春福章
日期:2013-02-25 14:51:24ITPUB十周年纪念徽章
日期:2011-11-01 16:24:51暖羊羊
日期:2015-06-22 15:51:36
3#
 楼主| 发表于 2015-3-5 16:50 | 只看该作者
lujinke 发表于 2015-3-5 14:22
MySQL的行锁是通过对索引加锁来实现,如果没有索引,就需要全表扫描,会锁住整个表

这个例子是从Mysql官网上copy的,至少当innodb_locks_unsafe_for_binlog=1时会话2不会被阻塞,而且会话1并不是使用表锁
http://dev.mysql.com/doc/refman/ ... s_unsafe_for_binlog

使用道具 举报

回复
论坛徽章:
3
懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18蒙奇·D·路飞
日期:2017-09-21 11:23:37
4#
发表于 2015-3-6 00:19 | 只看该作者
myownstars 发表于 2015-3-5 16:50
这个例子是从Mysql官网上copy的,至少当innodb_locks_unsafe_for_binlog=1时会话2不会被阻塞,而且会话1并 ...

在这个选线被打开的时候会加锁会进行优化,会提前释放掉不符合条件数据上的锁,但是
谁会把这个选线打开呢?看名字就知道打开对于复制是unsafe的

使用道具 举报

回复
论坛徽章:
10
2011新春纪念徽章
日期:2011-02-18 11:43:342015年新春福章
日期:2015-03-06 11:58:18懒羊羊
日期:2015-03-04 14:52:11马上有钱
日期:2014-02-18 16:43:092014年新春福章
日期:2014-02-18 16:43:09优秀写手
日期:2013-12-18 09:29:11三菱
日期:2013-08-30 20:37:412013年新春福章
日期:2013-02-25 14:51:24ITPUB十周年纪念徽章
日期:2011-11-01 16:24:51暖羊羊
日期:2015-06-22 15:51:36
5#
 楼主| 发表于 2015-3-6 09:20 | 只看该作者
lujinke 发表于 2015-3-6 00:19
在这个选线被打开的时候会加锁会进行优化,会提前释放掉不符合条件数据上的锁,但是
谁会把这个选线打开 ...

将事务级别设置成read-commited时 即便打开该参数也应该不会unsafe

使用道具 举报

回复
论坛徽章:
3
懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18蒙奇·D·路飞
日期:2017-09-21 11:23:37
6#
发表于 2015-3-6 12:42 | 只看该作者
myownstars 发表于 2015-3-6 09:20
将事务级别设置成read-commited时 即便打开该参数也应该不会unsafe

呵呵,RC隔离级别下,本身binlog复制就是不安全的,无论你怎么调其他选项

使用道具 举报

回复
论坛徽章:
10
2011新春纪念徽章
日期:2011-02-18 11:43:342015年新春福章
日期:2015-03-06 11:58:18懒羊羊
日期:2015-03-04 14:52:11马上有钱
日期:2014-02-18 16:43:092014年新春福章
日期:2014-02-18 16:43:09优秀写手
日期:2013-12-18 09:29:11三菱
日期:2013-08-30 20:37:412013年新春福章
日期:2013-02-25 14:51:24ITPUB十周年纪念徽章
日期:2011-11-01 16:24:51暖羊羊
日期:2015-06-22 15:51:36
7#
 楼主| 发表于 2015-3-6 14:57 | 只看该作者
lujinke 发表于 2015-3-6 12:42
呵呵,RC隔离级别下,本身binlog复制就是不安全的,无论你怎么调其他选项

这个还真不知道,能否举个例子或者给个链接

使用道具 举报

回复
论坛徽章:
10
2011新春纪念徽章
日期:2011-02-18 11:43:342015年新春福章
日期:2015-03-06 11:58:18懒羊羊
日期:2015-03-04 14:52:11马上有钱
日期:2014-02-18 16:43:092014年新春福章
日期:2014-02-18 16:43:09优秀写手
日期:2013-12-18 09:29:11三菱
日期:2013-08-30 20:37:412013年新春福章
日期:2013-02-25 14:51:24ITPUB十周年纪念徽章
日期:2011-11-01 16:24:51暖羊羊
日期:2015-06-22 15:51:36
8#
 楼主| 发表于 2015-3-6 17:32 | 只看该作者
lujinke 发表于 2015-3-6 12:42
呵呵,RC隔离级别下,本身binlog复制就是不安全的,无论你怎么调其他选项

Gap locking can be disabled explicitly. This occurs if you change the transaction isolation level to READ COMMITTED or enable the innodb_locks_unsafe_for_binlog system variable (which is now deprecated). Under these circumstances, gap locking is disabled for searches and index scans and is used only for foreign-key constraint checking and duplicate-key checking.

There are also other effects of using the READ COMMITTED isolation level or enabling innodb_locks_unsafe_for_binlog: Record locks for nonmatching rows are released after MySQL has evaluated the WHERE condition. For UPDATE statements, InnoDB does a “semi-consistent” read, such that it returns the latest committed version to MySQL so that MySQL can determine whether the row matches the WHERE condition of the UPDATE.
http://dev.mysql.com/doc/refman/ ... rd-level-locks.html

RC级别只是禁用了gap lock,如何能导致binlog复制不安全

使用道具 举报

回复
论坛徽章:
3
懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18蒙奇·D·路飞
日期:2017-09-21 11:23:37
9#
发表于 2015-3-9 01:02 | 只看该作者
本帖最后由 lujinke 于 2015-3-9 01:17 编辑
myownstars 发表于 2015-3-6 17:32
Gap locking can be disabled explicitly. This occurs if you change the transaction isolation level ...
补充一下:不安全是指对SBR(基于Statement的复制)不安全

select * from t;
-----------------
1
2
3

++++++++++++++++++++++++++++++++++++++++++
session 1
BEGIN;

                                                                        session 2:
                                                                        BEGIN;
                                                                        update t set id=id*2;
insert into t values(7);
COMMIT;
                                                                        COMMIT;

+++++++++++++++++++++++++++++++++++++++++++
执行完后,master上表t的内容是2,4,6,7

slave 上表t的内容是(先执行session 1,然后是session2):
2,4,6,14

使用道具 举报

回复
论坛徽章:
0
10#
发表于 2015-3-9 11:08 | 只看该作者
lujinke 发表于 2015-3-6 12:42
呵呵,RC隔离级别下,本身binlog复制就是不安全的,无论你怎么调其他选项

很多公司都喜欢把mysql的隔离级别从RR改为RC,此时,基于statement的主从复制就会有问题哈,

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表