MySQL Batch 与 Transaction
最近在数据库上经常遇到死锁问题. 表现的问题有
1. 有一个查询为:
1) 一个复杂的 select 查处一组大数据
2) 使用事务 update 这组数据的状态
为了让锁定的时间变短, 我将这整个大事务切分成了多个小事务, 也就是每次查询并更新 1W 数据变为了每次查询并更新 100 数据, 但是需要查询更新 100 次, 总数据量还是 1W
这样就造成了一个问题, 因为这个 select 是个复杂查询, 这里 100 次 select 使得整个操作时间急剧上升.
所以我认为最好的做法是, 先把 1W 数据用 select 查询出来, 然后 update 操作分组, 例如每次 update 1000, 如果这次事务 update 失败, 则将 update 失败的这些数据从 select 结果集中去掉
2. 有一个大量的结果集更新, 例如 5W 条, 原来我的做法是切分为 10 个小事务, 每次更新 5000 条, 顺序更新
实际上这里没有必要用事务, 因为我对他们没有一致性和原子性要求. 使用事务的好处是效率提高, 因为 MySQL 默认是 autocommit = true, 相当于没条语句是一个事务. 但是使用事务的缺点是 update 的锁的持有时间会加长, 容易造成死锁.
最后的解决方案是使用多线程同时执行, 并且不适用事务, 但是使用 preparedStatement (batch).
最后看看我的测试数据, 一共测试了 10W 的数据
1. 使用 batch 一次性执行完毕, 共耗费 55s
2. 使用多线程并发执行, 每个线程 batch 数量为 5000, 线程池大小是 CPU核数 * 2, 共耗费 11s
3. 不适用 batch, 但是用多线程执行, 每个线程负责 5000 数据插入, 共耗费 24s
4. 使用事务, 但是不用 batch, 使用多线程执行, 每个线程负责 5000 数据, 共耗费 14s
5. 使用事务, 同时使用 batch, 使用多线程, 每个线程 5000 数据, 共耗费 8s
可见使用事务, 同时 batch 效率最高, 但是使用事务会加长锁的持有时间, 这点需要注意
MySQL Batch 与 Transaction的更多相关文章
- mysql事务,START TRANSACTION, COMMIT和ROLLBACK,SET AUTOCOMMIT语法
http://yulei568.blog.163.com/blog/static/135886720071012444422/ MyISAM不支持 START TRANSACTION | BEGIN ...
- mysql --batch --skip-column-name --execute 使用
mysql -h 127.0.0.1 -P 3306 -u root -p -D test --batch --skip-column-name --execute="select * fr ...
- Django Mysql SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
Django 执行makemigrations 的时候报错: django.db.utils.ProgrammingError: (1064, "You have an error in ...
- MySQL存储过程 事务transaction
MySQL 中,单个 Store Procedure(SP) 不是原子操作,而 Oracle 则是原子的.如下的存储过程,即使语句2 失败,语句 1 仍然会被 commit 到数据库中: create ...
- 配置MySQL GTID(Global Transaction IDs)复制
一.GTID的简介 1.GTID的概述 .全局事物标识:global transaction identifieds. .GTID事物是全局唯一性的,且一个事务对应一个GTID. .一个GTID在一个 ...
- mysql & java & spring transaction isolation level
mysql /*SESSION LEVEL*/ select @@tx_isolation; /*GLOBAL LEVEL*/ select @@global.tx_isolation; select ...
- [MySQL] MySQL存储过程 事务transaction 数据表重建
直接上代码 -- 删除存储过程 DROP PROCEDURE IF EXISTS `renew_message_queue`; -- 添加; 的转义 DELIMITER ;; CREATE PROCE ...
- Mysql的transaction实现(转)
(http://www.blogjava.net/i369/archive/2007/04/29/108906.html) transaction在数据库编程中是一个重要的概念,这样做可以控制对数据库 ...
- 学习笔记:The Best of MySQL Forum
http://mysql.rjweb.org/bestof.html I have tagged many of the better forum threads. 'Better' is based ...
随机推荐
- 服务发现之 Etcd VS Consul
抄自这里 *********************************************************************************************** ...
- 在同一个机器上运行两个jboss修改配置
http://blog.sina.com.cn/s/blog_8ebe17aa0101mnft.html 解决办法:修改 \jboss-4.0.4.GA\server\default\conf 目录下 ...
- boost::asio::socket tcp 连接 在程序结束时崩溃。
刚开始的时候一直不知道怎么回事,不过幸好我有在每个class 的析构时都打印一条信息. 这个时候发现我的一个tcp_connection (就是自定义的一个连接类) 在最后才被析构. 所以感觉这里可能 ...
- yield个人理解及简明示例
1.写法有2种:yield return <expression>和yield breakyield用于在迭代中返回一个值,并将值带入下一次迭代中.yield break则意味着停止迭代. ...
- Codeforces724D [字符串][乱搞][贪心]
/* 不要低头,不要放弃,不要气馁,不要慌张 题意:给你一个区间长度n和一个字符串,要求在字符串中选择一些symbol使得字符串的任意长度为n的子区间都存在至少一个symbol. 任意选取symbol ...
- revealapp 用于调试IOS的UI
下载地址(官网):http://revealapp.com/ 破解方法:http://blog.csdn.net/ljb_wh/article/details/39345599
- IIS7 rename application or site
rename site 比较容易,在IIS里面就可以直接 rename,也可以用 cmd 的方式 1. 打开 cmd 2. cd C:\Windows\System32\inetsrv 3. appc ...
- JavaScript执行bat文件清理浏览器缓存
function exec() { window.onerror = function (err) { if (err.indexOf('utomation') != -1) { alert('命令已 ...
- strlen和sizeof
1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型.该类型保证能容纳实现所建立的最大对象的字节大小. 2.sizeof是算符,strlen是函数. ...
- 窗口 超类化 子类化 HOOK
body { font-family: Bitstream Vera Sans Mono; font-size: 11pt; line-height: 1.5; } html, body { colo ...