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

时间: 2024-10-10 16:19:01

MySQL Batch 与 Transaction的相关文章

Spring Batch Hello World Example

Spring Batch is a framework for batch processing – execution of a series of jobs. In Spring Batch, A job consists of many steps and each step consists of a READ-PROCESS-WRITE task or single operation task (tasklet). For “READ-PROCESS-WRITE” process,

MySQL 5.6 Reference Manual-14.6 InnoDB Table Management

14.6 InnoDB Table Management 14.6.1 Creating InnoDB Tables 14.6.2 Moving or Copying InnoDB Tables to Another Machine 14.6.3 Grouping DML Operations with Transactions 14.6.4 Converting Tables from MyISAM to InnoDB 14.6.5 AUTO_INCREMENT Handling in Inn

Spring MVC+Mybatis+Maven+Velocity+Mysql整合实例

本篇文章将通过一个简单显示用户信息的实例整合Spring mvc+mybatis+Maven+velocity+mysql. 对于实现整合的重点在于以下几个配置文件的实现 1.Maven依赖包 2.spring配置文件(springContext-user.xml) 3.mybatis配置文件(MyBatis-User-Configuration.xml) 4.spring-mvc配置文件(spring-mvc.xml) 5.web.xml配置文件 源码下载地址:http://download.

万树IT:Spring Batch批处理框架技巧,让你不再重复造轮子

整理了Spring批处理框架的内容,掌握这些知识,可以帮你省去一些造轮子的过程,提高开发效率.本文由博主姚兆峰分享,小编整理后推送,希望对你的工作有帮助. Part.1 问题分析 在大型的企业应用中,或多或少都会存在大量的任务需要处理,如邮件批量通知所有将要过期的会员等等.而在批量处理任务的过程中,又需要注意很多细节,如任务异常.性能瓶颈等等.那么,使用一款优秀的框架总比我们自己重复地造轮子要好得多一些. AD 我所在的物联网云平台部门就有这么一个需求,需要实现批量下发命令给百万设备.为了防止枯

MySQL 四种事务隔离级的说明[转]

很早之前写的文章,重新回顾和学习下: 按照SQL:1992 事务隔离级别,InnoDB默认是可重复读的(REPEATABLE READ).MySQL/InnoDB 提供SQL标准所描述的所有四个事务隔离级别.你可以在命令行用--transaction-isolation选项,或在选项文件里,为所有连接设置默认隔离级别.例如,你可以在my.inf文件的[mysqld]节里类似如下设置该选项: transaction-isolation = {READ-UNCOMMITTED | READ-COMM

事务 mysql redis

mysql 事务 start transaction; update ... insert ... create table的不行 rollback;//回滚 commit;//提交 redis 事务 multi incrby age 1 //age+1 decrby age 2 //age-2 discard //取消执行 (discard 丢弃) exec //执行 ----------------------- watch keyName1 keyName2 keyName3 ... mu

00 MySQL

1数据库 1.1名词解释 DB:数据库Database,用于存放数据仓库 DBMS:数据库管理系统 DataBase Management System,管理数据库 table : 表,用于描述实体(对象)集合,需要提供行和列 1.2数据库分类 网状型数据库 层次型数据库 关系型数据库(Relationship DataBase Management System) 非关系型数据库:NoSql (not only sql) 1.3关系型数据库种类 DB2 : IBM公司,收费 Oracle :

storm transaction

storm transaction storm的事务主要用于对数据准确性要求非常高的环境中,尤其是在计算交易金额或笔数,数据库同步的场景中. storm 事务逻辑是挺复杂的,而且坦白讲,代码写的挺烂的. JStorm下一步将重新设计基于Meta 1 和Meta3 的事务模型,让使用者更简便,代码更清晰. 一个基本的例子 你可以通过使用TransactionalTopologyBuilder来创建transactional topology. 下面就是一个transactional topolog

Spring Batch 简单应用 (三)(XML文件操作)

前篇关于Spring Batch的文章,讲述了Spring Batch 对CSV文件的读写操作. 本文将通过一个完整的实例,与大家一起讨论运用Spring Batch对XML文件的读写操作.实例流程是从一个XML文件中读取商品信息,经过简单的处理,写入另外一个XML文件中. 工程结构如下图: log4j.xml是log处理的配置文件,与本文没有必然联系,再此不做论述. application.xml文件内容如下: 按 Ctrl+C 复制代码 <?xml version="1.0"