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

求助:mysql tree 并发死锁

[复制链接]
论坛徽章:
1
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:51
11#
发表于 2011-9-23 19:07 | 只看该作者
不知LZ是否解决了这个问题

我现在也正被此问题困扰
两条insert语句
只要并发执行就会报死锁
其中一条回滚

表结构简单描述如下
col1   col2  colN...
建表时没有指定主键 没有聚簇索引
通过create index在col1和col2上分别创建BTREE索引(默认的普通的索引。。。)
其中col1实际上就是主键 其中没有重复值 只不过是通过程序控制的
col2上是可以有重复值的

执行sql
insert into table(col1,col2,colN...)  values(1,10,...)
insert into table(col1,col2,colN...)  values(1,11,...)
就会报死锁
从死锁信息中可以看到 和col2上的索引有关
删掉该索引进行测试 没有问题了
这个非常奇怪啊
谁能给解释一下

感觉应该是mysql机制的问题
或者是否是个bug

使用道具 举报

回复
论坛徽章:
27
数据库板块每日发贴之星
日期:2005-12-22 01:01:31ITPUB十周年纪念徽章
日期:2011-11-01 16:21:152012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:09版主2段
日期:2012-05-15 15:24:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
12#
发表于 2011-9-25 13:59 | 只看该作者
1) 事实是死锁发生了。
    SESSION 2 在等 SESSION1 释放
    SESESION 1 的SQL2 又在等SESSION2 释放 ;
2) 为什么在SESSION2里发生ROLLBACK 。
    MYSQL在检查到死锁后,需要判断出回滚一个SESSION,那么另一个SESSION就可以继续;
    在这个例子里, SESSION2 其实还没有产生回滚记录,产生回滚他是成本最小的;   
      如果SESSION 1 , SESSION2 死锁之前都有回滚记录产生了, 那么一般会回滚 后来者 (触发死锁产生的那个SESSION,在这个例子里应该是SESSION1)

3) 这里没有间隙锁;  大家可以show engine innodb status 看到的;  
    在SESSION2 执行完SQL后,
     RECORD LOCKS space id 22 page no 3 n bits 80 index `PRIMARY` of table `test`.`section` trx id 0 17880343 lock_mode X locks rec but not gap waiting

使用道具 举报

回复
论坛徽章:
27
数据库板块每日发贴之星
日期:2005-12-22 01:01:31ITPUB十周年纪念徽章
日期:2011-11-01 16:21:152012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:09版主2段
日期:2012-05-15 15:24:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
13#
发表于 2011-9-25 14:05 | 只看该作者
本帖最后由 Steven_1981 于 2011-9-25 14:13 编辑

LZ 事务隔离级别应该是repeatable-read ;

在SESSION2 完成后:
------- TRX HAS BEEN WAITING 3 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 22 page no 4 n bits 80 index `tree_left` of table `test`.`section` trx id 0 17881112 lock_mode X locks gap before rec insert intention waiting

这里发生间隙锁是正常的,防止>9的数据插入,产生幻读;  read_commit就不需要产生这个锁;

如果死锁一样还是发生在SESSION2上面;
    原因与之前分析的一样

使用道具 举报

回复
论坛徽章:
27
数据库板块每日发贴之星
日期:2005-12-22 01:01:31ITPUB十周年纪念徽章
日期:2011-11-01 16:21:152012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:09版主2段
日期:2012-05-15 15:24:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
14#
发表于 2011-9-25 14:17 | 只看该作者
75708332 发表于 2011-9-23 19:07
不知LZ是否解决了这个问题

我现在也正被此问题困扰

光是两个INSERT,是绝对不会发生死锁的;

是不是一个事务里还有其它的语句?

使用道具 举报

回复
论坛徽章:
1
ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
15#
发表于 2011-9-25 22:45 | 只看该作者
两个insert  只有可能发生等待, 而相互等待  才会发生死锁

使用道具 举报

回复

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

本版积分规则 发表回复

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