12
返回列表 发新帖
楼主: mysqldbd

[原创] 如何理解串行执行?

[复制链接]
论坛徽章:
9
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:512012新春纪念徽章
日期:2012-01-04 11:56:44ITPUB 11周年纪念徽章
日期:2012-10-09 18:14:482013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08
11#
发表于 2011-3-29 22:08 | 只看该作者
"耗时的Select语句,参杂了一些Insert语句" 这句话看得纠结,我不知道怎么掺杂的.

使用道具 举报

回复
论坛徽章:
4
2011新春纪念徽章
日期:2011-04-15 12:20:32咸鸭蛋
日期:2011-08-05 11:40:05ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292012新春纪念徽章
日期:2012-01-04 11:57:56
12#
 楼主| 发表于 2011-3-31 17:56 | 只看该作者
原帖由 ucgary 于 2011-3-29 22:08 发表
"耗时的Select语句,参杂了一些Insert语句" 这句话看得纠结,我不知道怎么掺杂的.


我也不太懂,不太明白,希望大家指点。

使用道具 举报

回复
论坛徽章:
3
2010新春纪念徽章
日期:2010-03-01 11:20:072011新春纪念徽章
日期:2011-02-18 11:42:49ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
13#
发表于 2011-3-31 18:11 | 只看该作者
没必要去追究“串行执行”这个词。关键是前面的“耗时的Select语句,参杂了一些Insert语句”:在innodb中,默认“Repeatable Read”隔离事务下面,SELECT不会加锁,应该不会导致INSERT锁住的情况;在myisam,默认SELECT 又是READ LOCAL模式,也不会导致INSERT锁情况。除非在SELECT加了排它锁、共享锁吧?

使用道具 举报

回复
论坛徽章:
9
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:512012新春纪念徽章
日期:2012-01-04 11:56:44ITPUB 11周年纪念徽章
日期:2012-10-09 18:14:482013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08
14#
发表于 2011-4-2 13:31 | 只看该作者
对WRITE,MySQL使用的表锁定方法原理如下:
如果在表上没有锁,在它上面放一个写锁。
否则,把锁定请求放在写锁定队列中。
对READ,MySQL使用的锁定方法原理如下:
如果在表上没有写锁定,把一个读锁定放在它上面。
否则,把锁请求放在读锁定队列中。
当一个锁定被释放时,锁定可被写锁定队列中的线程得到,然后是读锁定队列中的线程。
这意味着,如果你在一个表上有许多更新,SELECT语句将等待直到没有更多的更新。
-----------------
· 一个客户发出长时间运行的查询。
· 然后,另一个客户对同一个表进行更新。该客户必须等待直到SELECT完成。
· 另一个客户对同一个表上发出了另一个SELECT语句。因为UPDATE比SELECT优先级高,该SELECT语句等待UPDATE完成,并且等待第1个SELECT完成。

使用道具 举报

回复
论坛徽章:
4
2011新春纪念徽章
日期:2011-04-15 12:20:32咸鸭蛋
日期:2011-08-05 11:40:05ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292012新春纪念徽章
日期:2012-01-04 11:57:56
15#
 楼主| 发表于 2011-4-2 14:43 | 只看该作者
原帖由 ucgary 于 2011-4-2 13:31 发表
对WRITE,MySQL使用的表锁定方法原理如下:
如果在表上没有锁,在它上面放一个写锁。
否则,把锁定请求放在写锁定队列中。
对READ,MySQL使用的锁定方法原理如下:
如果在表上没有写锁定,把一个读锁定放在它上面。
否则,把锁请求放在读锁定队列中。
当一个锁定被释放时,锁定可被写锁定队列中的线程得到,然后是读锁定队列中的线程。
这意味着,如果你在一个表上有许多更新,SELECT语句将等待直到没有更多的更新。
-----------------
· 一个客户发出长时间运行的查询。
· 然后,另一个客户对同一个表进行更新。该客户必须等待直到SELECT完成。
· 另一个客户对同一个表上发出了另一个SELECT语句。因为UPDATE比SELECT优先级高,该SELECT语句等待UPDATE完成,并且等待第1个SELECT完成。


不是很明白:

· 1 第一个客户发出长时间运行的查询。
· 2 然后,第二个客户对同一个表进行更新。该客户必须等待直到SELECT完成。
· 3 第三个客户对同一个表上发出了另外一个SELECT语句。因为UPDATE比SELECT优先级高,该SELECT语句等待UPDATE完成,并且等待第1个客户的SELECT完成

在第三个客户是何时执行select操作的?是跟第二个客户同时执行的吗?在第三个客户自行select的时候,第二个客户正在执行update,这个时候第一个客户的select早执行完了吧
为什么第三个客户在第二个客户执行完update后海需要等待第一个客户执行完select呢? 根本没有必要吧,因为第一个客户的select早就第二个客户执行update之前就已经执行完了。

使用道具 举报

回复
论坛徽章:
8
双黄蛋
日期:2011-08-11 14:51:29蜘蛛蛋
日期:2011-08-15 20:53:08灰彻蛋
日期:2011-08-23 17:46:31ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292012新春纪念徽章
日期:2012-01-04 11:57:56咸鸭蛋
日期:2012-01-09 11:14:00紫蛋头
日期:2012-03-20 17:08:01优秀写手
日期:2013-12-18 09:29:14
16#
发表于 2011-4-21 16:33 | 只看该作者
今天遇到这种情况,理解了。

使用道具 举报

回复
论坛徽章:
0
17#
发表于 2014-12-23 16:31 | 只看该作者
ucgary 发表于 2011-3-25 21:21
1. 这是myisam. 不用myisam就好了;
2. 首先select ..很久.没完 ---->  然后insert ....会被阻塞(没有疑问吧 ...

请问,myisam引擎如果退休,那么对于一些查询多更新少的数据库怎么办?

使用道具 举报

回复
论坛徽章:
0
18#
发表于 2014-12-23 16:31 | 只看该作者
TomLeng 发表于 2011-3-26 13:33
myisam表在某些环境下,select和insert是可以并行的

没错,可以设置的

使用道具 举报

回复
论坛徽章:
3
懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18蒙奇·D·路飞
日期:2017-09-21 11:23:37
19#
发表于 2014-12-23 21:34 | 只看该作者
本帖最后由 lujinke 于 2014-12-23 21:35 编辑
ucgary 发表于 2011-3-25 21:21
1. 这是myisam. 不用myisam就好了;
2. 首先select ..很久.没完 ---->  然后insert ....会被阻塞(没有疑问吧 ...

首先 再默认隔离级别下(RR)select不会阻塞insert
其次mysq至少从l5.5开始默认引擎就不是myisam了

使用道具 举报

回复

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

本版积分规则 发表回复

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