mysql innodb 多线程插入_mysql innodb 并发插入问题,包大量死锁错误
开了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 并发插入问题,包大量死锁错误相关推荐
- mysql innodb 并发插入问题_包大量死锁错误_mysql innodb 并发插入问题,包大量死锁错误...
开了10个并发写线程,没1000条记录批量提交一次,结果mysql包大量死锁错误! "Deadlock found when trying to get lock; try restarti ...
- MySQL学习笔记(五)并发时经典常见的死锁原因及解决方法
MySQL学习笔记(五)并发时经典常见的死锁原因及解决方法 参考文章: (1)MySQL学习笔记(五)并发时经典常见的死锁原因及解决方法 (2)https://www.cnblogs.com/tiny ...
- 论 MySql InnoDB 如何通过插入意向锁控制并发插入
前言 在讲解之前,先来思考一个问题--假设有用户表结构如下: MySql,InnoDB,Repeatable-Read:users(id PK, name, age KEY) id name age ...
- 初探mysql innodb集群_MySQL InnoDB Cluster搭建
MySQL的高可用架构无论是社区还是官方,一直在技术上进行探索,这么多年提出了多种解决方案,比如MMM, MHA, NDB Cluster, Galera Cluster, InnoDB Cluste ...
- mysql触发器 生僻字_MySQL生僻字插入失败的处理方法(Incorrect string value)
最近,业务方反馈有个别用户信息插入失败,报错提示类似"Incorrect string value:"\xF0\xA5 ..... " 看这个提示应该是字符集不支持某个生 ...
- mysql innodb 并发 插入 慢_InnoDB并发插入,居然使用意向锁?
今天,将要介绍InnoDB另外三种:共享/排他锁,意向锁,插入意向锁. 一,共享/排它锁(Shared and Exclusive Locks) < InnoDB并发为何这么高? >一文介 ...
- mysql innodb事务中_MySQL InnoDB如何保证事务特性示例详解
前言 如果有人问你"数据库事务有哪些特性"?你可能会很快回答出原子性.一致性.隔离性.持久性即ACID特性.那么你知道InnoDB如何保证这些事务特性的吗?如果知道的话这篇文章就可 ...
- mysql innodb禁用事务_MySQL InnoDB事务中锁问题(三)
试想,事务如果都是串行的,那么就不需要锁了,但是性能肯定没法接受.加锁只是为了提高事务并行度,并且解决并发事务执行过程中引起的脏写.脏读.不可重复读.幻读这些问题的一种解决方案(MVCC算是一种解决脏 ...
- mysql 散列查询_MySQL InnoDB中hash查找表的实现
MySQL版本:5.7.14 源码位置为hash0hash.h hash0hash.cc 作为一种时间复杂度最优为O(1)的数据结构,但是最坏时间复杂对位O(n)的一种数据结构,但是在良好的设计has ...
最新文章
- html select选择事件_按键精灵的Html系列命令实战讲解
- dataframe 一列的不同值_python数据分析包|Pandas-02之缺失值(NA)处理
- html 去文本框中的双引号_前端·HTML基础
- java 十六进制数的转换
- RabbitMQ 消息队列
- linux编译trinitycore,TC编译步骤之二代码安装
- 远程连接端口修改,使用注册表修改
- 《Gradle实战》如何配置利用Maven本地仓库
- 区块链技术正大肆颠覆价值数十亿美元的金融科技产业
- mes系统和plc通讯案例_MES管理系统怎么和PLC通信?
- 软件测试-正交试验法
- 计算机用户里的AppData,AppData是什么意思,Appdata文件夹可以删除吗?
- kali linux网络扫描~局域网扫描
- 喜报!字根科技牵手荣之联,提供错别字检测解决方案
- Performance Monitor2:性能计数器
- 04-Spark入门
- Android组件化跨进程通信框架Andromeda解析
- 深入理解Java异常机制
- 用Mapviz显示卫星地图轨迹
- 华中农业大学算法实验课答案
热门文章
- Julia女神告诉我任何一家企业本质上都是一家软件公司
- .NET Core 2.0 开源Office组件 NPOI
- 微软发布Azure Stack更多细节,预计9月交付
- 从真实项目中抠出来的设计模式——第一篇:策略模式
- ZKEACMS for .Net Core 深度解析
- Spring Boot 解决跨域Cors问题
- ArcGIS实验教程——实验十三:栅格空间插值分析
- Android之运行PopupWindow提示Unable to add window -- token null is not valid; is your activity running?
- C和指针之实现可变参数函数编译出现expanded from macro ‘va_arg‘ #define va_arg(ap, type) 解决办法
- C++类和new、delete操作符和堆和栈内存的分配