zoukankan      html  css  js  c++  java
  • mysql DUPLICATE KEY UPDATE 问题

    DUPLICATE KEY UPDATE batch执行时出死锁错误

    背景知识

    一、 mysql  insert 与 duplicate key:

    典型的插入语句:

    多条:INSERT INTO tablename (columnA, columnB, columnC)

    VALUES ('a', 1, 2), ('b', 7, 5)

    单条:INSERT INTO tablename SET columnA='a', columnB=1, columnC=2

    复制:INSERT [options1] [INTO] tablename [ (columnlist) ]
    SELECT …

    若表已设置主键如columnA,重复的插入无效

    ERROR 1062 (23000): Duplicate entry 'value' for key 'PRIMARY'

    如果数据库中已有某条数据,以下的两条语句可等同:

    INSERT INTO tablename (id, data) VALUES (1, 10)
    ON DUPLICATE KEY UPDATE data=data+10;
    UPDATE tablename SET data=data+10 WHERE id=1;

    duplicate key语句一般应用在 格式化多条更新语句:

    INSERT INTO tablename (id, data) VALUES (1, 10), (2, 15)
    ON DUPLICATE KEY UPDATE data=data+VALUE(data)

    二、innodb表提高插入效率

    查询表使用的引擎:  show create table tablename;

    innodb 的存储引擎提供行级锁,支持共享锁和排他锁两种锁定模式,以及四种不同的隔离级别。

    对于Innodb 类型的表,我们有以下几种方式可以提高导入的效率:
    a. 因为Innodb 类型的表是按照主键的顺序保存的,所以将导入的数据按照主键的顺
    序排列,可以有效的提高导入数据的效率。如果Innodb 表没有主键,那么系统会默认
    创建一个内部列作为主键,所以如果可以给表创建一个主键,将可以利用这个优势提高
    导入数据的效率。
    b. 在导入数据前执行SET UNIQUE_CHECKS=0,关闭唯一性校验,在导入结束后执行SET
    UNIQUE_CHECKS=1,恢复唯一性校验,可以提高导入的效率。
    c. 如果应用使用自动提交的方式,建议在导入前执行SET AUTOCOMMIT=0,关闭自动
    提交,导入结束后再执行SET AUTOCOMMIT=1,打开自动提交,也可以提高导入的效率。

    如果如果你同时从同一客户插入很多行,使用多个值表的INSERT 语句。这比使用分开INSERT 语句快(在一些情况中几倍)。

    你从不同客户插入很多行,能通过使用INSERT DELAYED 语句得到更高的速度。Delayed 的含义是让insert 语句马上执行,其实数据都被放在内存的队列中,并没有真正写入磁盘;这比每条语句分别插入要快的多;LOW_PRIORITY 刚好相反,在所有其他用户对表的读写完后才进行插入;

    在项目中遇到的问题时,使用了这种insert处理,但是分库分表,数据表类型为innodb,  tablename各不相同,duplicate key只是用于合并update和insert语句。

     "java.sql.BatchUpdateException: Deadlock found when trying to get lock; try restarting transaction" 错误状况为 第一个插入即出错,或一个batch中重复一个key,插入多个值。 貌似mysql有这个bug(http://bugs.mysql.com/bug.php?id=52020

    使用threadlocal去获取操作数据库的对象,static对象,获取pool的连接并执行批处理方法


    PRIMARY KEY

    UNIQUE KEY 的区别

  • 相关阅读:
    假如
    天涯 好文章
    Widget中PendingIntent和RemoteViews用法
    申请android google map API key
    初步学习:Eclipse3.6开发C/C++程序
    Android getWidth和getMeasuredWidth的正解
    intent intentfilter
    mapview 生成apikey
    ViewConfiguration.getScaledTouchSlop () 用法
    Android JNI知识简介
  • 原文地址:https://www.cnblogs.com/shenguanpu/p/2506080.html
Copyright © 2011-2022 走看看