开了10个并发写线程,没1000条记录批量提交一次,结果mysql包大量死锁错误!

"Deadlock found when trying to get lock; try restarting transaction"

引擎用的是Innodb 主键字段是auto_increament.

mysql 有这么脆弱吗?create table ASIA_ODDS(

id int NOT NULL AUTO_INCREMENT,

match_id INT DEFAULT 0,

match_bet007_id INT NOT NULL,

company_id SMALLINT NOT NULL ,

first_pk DECIMAL(9,4) DEFAULT 0,

first_host_odds DECIMAL(9,4) DEFAULT 0,

first_guest_odds DECIMAL(9,4) DEFAULT 0,

pk DECIMAL(9,4) ,

host_odds DECIMAL(9,4) DEFAULT 0,

guest_odds DECIMAL(9,4) DEFAULT 0,

is_end TINYINT DEFAULT 0,

is_zd TINYINT DEFAULT 0 ,

changeState char(3) DEFAULT '000',

last_update_time timestamp ,

PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我的测试java代码如下:public class TestInsertAsiaOdds {

public static void main(String args[]) {

final long s = System.currentTimeMillis();

CyclicBarrier latch = new CyclicBarrier(10, new Runnable() {

public void run() {

System.out.print("耗时:" + (System.currentTimeMillis() - s));

}

});

//10个线程并发插入500w条数据

List lt = new ArrayList();

for (int i = 0; i < 10; i++) {

Thread t = new Thread(new Task(5000000, latch));

lt.add(t);

}

//启动线程

for (Thread t : lt) {

t.start();

}

}

private static class Task implements Runnable {

private int count;

private CyclicBarrier latch;

private String insSql = "insert into asia_odds2(match_id, match_bet007_id, company_id, first_pk, first_host_odds, first_guest_odds, pk, host_odds, guest_odds, is_end, is_zd, changeState) values(?,?,?,?,?,?,?,?,?,?,?,?)";

public Task(int count, CyclicBarrier latch) {

this.count = count; this.latch = latch;

}

public void run() {

Connection conn = null;

PreparedStatement ps = null;

try {

conn = getConn(); //设为自动提交

conn.setAutoCommit(true);

ps = conn.prepareStatement(insSql);

for (int i = 0; i < count; i++) {

ps.setInt(1, 1);

ps.setInt(2, 2);

ps.setInt(3, 3);

ps.setDouble(4, 1.1);

ps.setDouble(5, 1.1);

ps.setDouble(6, 1.1);

ps.setDouble(7, 1.1);

ps.setDouble(8, 1.1);

ps.setDouble(9, 1.1);

ps.setInt(10, 0);

ps.setInt(11, 0);

ps.setString(12, "000");

ps.addBatch();

//1000一批提交一次

if (i % 1000 == 0) {

ps.executeBatch();

ps.clearBatch();

}

}

ps.executeBatch();

} catch (Exception ex) {

ex.printStackTrace();

} finally {

if (conn != null) {

try {

conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

try {

latch.await();

} catch (BrokenBarrierException e) {

e.printStackTrace();

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

运行一段时间后就会报:java.sql.BatchUpdateException: Deadlock found when trying to get lock; try restarting >transaction at >com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1669) at >com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1085)

mysql innodb 多线程插入_mysql innodb 并发插入问题,包大量死锁错误相关推荐

  1. mysql innodb 并发插入问题_包大量死锁错误_mysql innodb 并发插入问题,包大量死锁错误...

    开了10个并发写线程,没1000条记录批量提交一次,结果mysql包大量死锁错误! "Deadlock found when trying to get lock; try restarti ...

  2. MySQL学习笔记(五)并发时经典常见的死锁原因及解决方法

    MySQL学习笔记(五)并发时经典常见的死锁原因及解决方法 参考文章: (1)MySQL学习笔记(五)并发时经典常见的死锁原因及解决方法 (2)https://www.cnblogs.com/tiny ...

  3. 论 MySql InnoDB 如何通过插入意向锁控制并发插入

    前言 在讲解之前,先来思考一个问题--假设有用户表结构如下: MySql,InnoDB,Repeatable-Read:users(id PK, name, age KEY) id name age ...

  4. 初探mysql innodb集群_MySQL InnoDB Cluster搭建

    MySQL的高可用架构无论是社区还是官方,一直在技术上进行探索,这么多年提出了多种解决方案,比如MMM, MHA, NDB Cluster, Galera Cluster, InnoDB Cluste ...

  5. mysql触发器 生僻字_MySQL生僻字插入失败的处理方法(Incorrect string value)

    最近,业务方反馈有个别用户信息插入失败,报错提示类似"Incorrect string value:"\xF0\xA5 ..... " 看这个提示应该是字符集不支持某个生 ...

  6. mysql innodb 并发 插入 慢_InnoDB并发插入,居然使用意向锁?

    今天,将要介绍InnoDB另外三种:共享/排他锁,意向锁,插入意向锁. 一,共享/排它锁(Shared and Exclusive Locks) < InnoDB并发为何这么高? >一文介 ...

  7. mysql innodb事务中_MySQL InnoDB如何保证事务特性示例详解

    前言 如果有人问你"数据库事务有哪些特性"?你可能会很快回答出原子性.一致性.隔离性.持久性即ACID特性.那么你知道InnoDB如何保证这些事务特性的吗?如果知道的话这篇文章就可 ...

  8. mysql innodb禁用事务_MySQL InnoDB事务中锁问题(三)

    试想,事务如果都是串行的,那么就不需要锁了,但是性能肯定没法接受.加锁只是为了提高事务并行度,并且解决并发事务执行过程中引起的脏写.脏读.不可重复读.幻读这些问题的一种解决方案(MVCC算是一种解决脏 ...

  9. mysql 散列查询_MySQL InnoDB中hash查找表的实现

    MySQL版本:5.7.14 源码位置为hash0hash.h hash0hash.cc 作为一种时间复杂度最优为O(1)的数据结构,但是最坏时间复杂对位O(n)的一种数据结构,但是在良好的设计has ...

最新文章

  1. html select选择事件_按键精灵的Html系列命令实战讲解
  2. dataframe 一列的不同值_python数据分析包|Pandas-02之缺失值(NA)处理
  3. html 去文本框中的双引号_前端·HTML基础
  4. java 十六进制数的转换
  5. RabbitMQ 消息队列
  6. linux编译trinitycore,TC编译步骤之二代码安装
  7. 远程连接端口修改,使用注册表修改
  8. 《Gradle实战》如何配置利用Maven本地仓库
  9. 区块链技术正大肆颠覆价值数十亿美元的金融科技产业
  10. mes系统和plc通讯案例_MES管理系统怎么和PLC通信?
  11. 软件测试-正交试验法
  12. 计算机用户里的AppData,AppData是什么意思,Appdata文件夹可以删除吗?
  13. kali linux网络扫描~局域网扫描
  14. 喜报!字根科技牵手荣之联,提供错别字检测解决方案
  15. Performance Monitor2:性能计数器
  16. 04-Spark入门
  17. Android组件化跨进程通信框架Andromeda解析
  18. 深入理解Java异常机制
  19. 用Mapviz显示卫星地图轨迹
  20. 华中农业大学算法实验课答案

热门文章

  1. Julia女神告诉我任何一家企业本质上都是一家软件公司
  2. .NET Core 2.0 开源Office组件 NPOI
  3. 微软发布Azure Stack更多细节,预计9月交付
  4. 从真实项目中抠出来的设计模式——第一篇:策略模式
  5. ZKEACMS for .Net Core 深度解析
  6. Spring Boot 解决跨域Cors问题
  7. ArcGIS实验教程——实验十三:栅格空间插值分析
  8. Android之运行PopupWindow提示Unable to add window -- token null is not valid; is your activity running?
  9. C和指针之实现可变参数函数编译出现expanded from macro ‘va_arg‘ #define va_arg(ap, type) 解决办法
  10. C++类和new、delete操作符和堆和栈内存的分配