数据库服务器ip 10.0.1.3发现有deadlock . show innodb status 部分信息如下ip 10.0.1.1
MySQL thread id 34501, query id 1170219884 prod2a 192.168.10.15 betbrain update
INSERT INTO Out (id, aId, b,c,e,f,g,h,i,k,...) values (8081,5209319,a,47,2,3,null,null,null,4.0,null,'C','N','Y') ,(8082,5209319,a,47,2,4,null,null,null,4.0,null,'C','N','Y')
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 345492 n bits 232 index `PRIMARY` of table `db/Out` trx id 0 412100899 lock_mode X insert intention waiting
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
ip 10.0.1.2
MySQL thread id 34533, query id 1170219891 prod2b 192.168.10.25 betbrain update
INSERT INTO Out (id, aId, b,c,e,f,g,h,i,k,...) values (8083,5209320,a,43,1,1,27330,null,null,null,null,'C','N','Y') ,(8084,5209320,a,43,1,1,27357,null,null,null,null,'C','N','Y')
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 0 page no 345492 n bits 232 index `PRIMARY` of table `db/Out` trx id 0 412100900 lock_mode X
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0请问insert 产生的是行级还是表级别的表

解决方案 »

  1.   

    查了好多书  知道这个deadlock是会 重新执行事务的饿 .所以数据不会丢的-----------这个楼上可以确定下吗 ?
    (发生deadlock后 innodb 一般都能自动检查到 并使得一个事务释放lock并回退
    另外一个事物获得lock 继续  执行事  所以上面数据并没有丢失
    但现在上面表55万记录 涉及外部lock 或者表级别lock innodb不能完全自动检查到死锁所以楼上请详细说明为什么insert 是行级别锁>>
    )还是想继续问下
    web机器1
    8081,5209319
    8082,5209319
    ...............web机器2
    8083,5209320
    8084,5209320
    这个deadlock到底如何产生的  该表pk 为 id, aId 字段
    上面例如8081,5209319就是主键
      

  2.   


    数据库的死锁一般是 系统争用资源时候资源有限一部分事务被锁住而让别的事务占用有限的资源,你的描述情况没有这个情况,2台web,不同的数据库服务器,争啥争啊?楼主多描述下,一台web数据库服务器上面你死锁的时候都有哪些别的事务在运行呢?
      

  3.   

    1 innodb的行锁锁的是索引键
    2 没听说过mysql有锁升级的概念
      

  4.   

    不管什么锁
    现在发现丢失数据发现死锁的时候
    web机器1
    8081,5209319
    8082,5209319
                     这边的数据正常会插入...............web机器2
    8083,5209320
    8084,5209320     如果死锁 这边数据将丢失原理在于
    发生deadlock后 innodb 一般都能自动检查到 并使得一个事务释放lock并回退
    另外一个事物获得lock 继续 执行事.  这样只能保证一边数据不丢失问该如何让数据不丢?
      

  5.   

    `PRIMARY` of table `db/Out`
    这个表 的pk (id,mesId) 2个字段是否是cluster的速度有问题.我思考把pk()------>唯一性索引 不知道能否解决问题
      

  6.   

    唯一性索引 有2种
    1 是non cluster unique
    2 是cluster  unique
    不知道选择哪1个
      

  7.   

    唯一性索引可惜 换这个后  (我用的是non cluster unique
    )
    死锁更严重了。1小时至少1个 而且每个不一样的 表和数据 。 以前没有统计有多少 但至少不像这么频繁 
     
      

  8.   

    行级,事物会回滚,Innodb不存在锁升级的概念
      

  9.   

    现在 要确定的是 pk(id,mesId)组合主键 ------>唯一性索引 是否有必要
    在测试库发现倒不是很明显 对于死锁问题的解决 
      

  10.   

    还是一个奇特问题
    死锁 的 时候 经常出现这个 。很头疼 。我的版本 5。1。49 在线其他 机器 都是准确的 索引名字。 唯独这个 版本出现 index "GEN_CLUST_INDEX" of(1) WAITING FOR THIS LOCK TO BE GRANTED:
    RECORD LOCKS space id 0 page no 311608 n bits 336 index `GEN_CLUST_INDEX` of table `db`.`Ehistory` trx id 0 791965586 lock_mode X locks rec but not gap waiting
    Record lock, heap no 128 PHYSICAL RECORD: n_fields 10; compact format; info bits 0
     0: len 6; hex 00000c937a43; asc zC;; 1: len 6; hex 00002f346f88; asc /4o ;; 2: len 7; hex 000003c0830b99; asc ;; 3: len 8; hex 000000000b1efd8e; asc ;; 4: len 8; hex 000000000000d9df; asc ;; 5: len 1; hex 83; asc ;; 6: len 8; hex 0000000001eadd7c; asc |;; 7: len 1; hex 44; asc D;; 8: len 1; hex 59; asc Y;; 9: len 1; hex 59; asc Y;;*** (2) TRANSACTION:
    TRANSACTION 0 791965576, ACTIVE 0 sec, process no 7209, OS thread id 1097619776 fetching rows, thread declared inside InnoDB 118
    mysql tables in use 1, locked 1
    126 lock struct(s), heap size 30704, 552 row lock(s), undo log entries 275
    MySQL thread id 140525, query id 1398512707 10.0.1.103 betbrain Updating
    update E
    GEN_CLUST_INDEX"   这个索引名字是该表灭有的俄    什么错误?
      

  11.   

    原来有在字段i建了索引了,所以测试才能正常插入!如果删除字段i上的索引,情况就和测试1是一样的。另外,我还犯了一个错,一直以为没手工对表建索引,会走InnoDB默认系统自动生成的索引!这个错误就比较低级了,这个也是没有通过explain分析语句的结果,呵呵!1. InnoDB行锁实现特点意味着:只有通过有索引条件查询数据,InnoDB才使用行级锁;否则,InnoDB将扫描全表,使用表锁!
    2. 如果对查询的结果有疑问,可以用explain来分析下查询语句的走向,就能清楚语句执行的前前后后。
      
       坚持技术,还是需要朋友间的多多交流的, 提问是好事情的"GEN_CLUST_INDEX"  这感觉是gap lock  他锁定一个范围 (确实没有表级别锁)
    现在不知道1 这个产生的原因   2 如何解决 这个问题 
      

  12.   


    当你的表没有主索引的时候,MYSQL会自动创建一个隐藏的索引。你看到的GEN_CLUST_INDEX就是默认主键索引的名称。
    《高性能MYSQL》关于EXPLAIN的那一节有说明。
      

  13.   

    《高性能MYSQL》  有时间一定要仔细研究下  . 可惜中文版本看很不舒服  英文版本有时间呀研究下我费力找了测试stage机器来删掉pk, 建立>唯一性索引但并没有明显改善
    总是提示这个错误 ndex `uniq_Outis表 这个是那个表的唯一性索引 (修改前是pk(id+mesid)
    现在是uniq_Outi>唯一性索引(id+mesid)    
    )但可惜没有明显的改善
      

  14.   

    思考能否 更换开发架构
    原来是 2台web  同时写入数据到 数据库服务器. 发生deadlock如果用ejb.(单独开一台组件服务器 )
    2台web 分别条用 ejb所在的服务器. 通过ejb 去写入数据到数据库服务器 
    这样ejb(com里面自动会对请求进行放一个序列 )
    按道理可以避免 上面得 2台web  同时写入数据到 数据库服务器的问题 ?
    (ejb类似com调试不方便  开发麻烦等缺点 )