多线程更新多个表数据

更新A、B、C等多张表数据,而且这些更新需要在同一个事务里保证一致性,这些表没有关联关系。能否使用多线程的方式实现,我试试下列方法在更新数据时会出现死锁,一个表执行完update语句后另外一个线程在执行时connection就会等待,以为第一执行的线程未提交事务countDownLatch.await()也等待,这样就一直等待死锁。这种场景能使用多线程吗,有没有其它好的解决方案?

    ...
    final CountDownLatch countDownLatch = new CountDownLatch(
            moduleTableList.size());
    for (final ModuleTable moduleTable : moduleTableList) {
        Thread t = new Thread(moduleTable.getTableName()) {
            @Override
            public void run() {
                TransactionStatus transactionStatus = null;
                try {
                    transactionStatus = beginTransaction();
                    ...//更新数据
                } catch (Throwable t) {
                    orgChangeInfo.setError(true);
                    ...
                } finally {
                    countDownLatch.countDown();
                    try {
                        countDownLatch.await();
                    } catch (InterruptedException e) {
                        logger.error("InterruptedException", e);
                    }
                    if (transactionStatus != null) {
                        if (orgChangeInfo.isError()) {
                            jtaTransactionManager
                                    .rollback(transactionStatus);
                        } else {
                            jtaTransactionManager
                                    .commit(transactionStatus);
                        }
                    }
                }
            }
        };
        t.start();
    }
    try {
        countDownLatch.await();
    } catch (InterruptedException e) {
        logger.error("InterruptedException", e);
    }
    ...
0

1个回答

只要不多表连查就行。

用Lock显示锁,countDownLatch在这种场景下不适合,浪费性能

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
多线程并发,同时执行一个表,避免数据缺失
FileSystemWatcher fileSystemWatcher1 = new FileSystemWatcher();//文件监控  public static object locker = new object();              ThreadPool.SetMinThreads(1, 1);//设置线程最小数量                 Thread
多线程分块读取数据表的设计与实现
一、应用场景 项目场景描述:数据表中共有45万条记录,如果使用单线程读取,需要耗费大约1个多小时的时间,因此考虑使用多线程读取数据表,将其加载到内存中。 项目需求: 多线程读取数据表,要求在1分钟之内将数据加载到内存中;存储数据的数据结构为Map,要考虑其线程安全;子线程读取数据完成后,主线程要进行相应的操作,因此设计中要考虑主线程等待子线程完成。 二、设计思路 2.1 分块读取
web开发中,多个线程对同一数据修改时的线程安全问题
在web应用中,每次请求都是不同的线程,因此,当对统一数据进行访问更新的时候,有可能会引发数据问题。 举个例子:有一个apple表,里面有个字段count,表示某种apple的数量。同时,后台提供获取这种苹果的服务,获取苹果之后,就需要将count的值修改。 假设apple表中有这么一条数据 id count 12345 100 ---------- class ...
java多线程查询多个数据库改进方式
package com.dinglin; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Hashtable; import java.util.Vector; pub...
多线程update批量更新造成的死锁,问题分析和解决办法
首先我们设想一个情况,然后来阐述今天的问题:现在有若干台服务器,用相同的接口去批量修改一批数据,但是数据中彼此有重复的数据。基于这个问题,出现下面这种情况的死锁-->   问题分析:因为1服务器修改的批次包括abcdef 这个时候刚好修改了abcd所以abcd的索引被锁住了,2服务器修改了efgh,这个时候efgh的索引被锁住了 因为批量修改是一个默认的事务,所以如果没有全部修改完...
查询两个表数据 并更新多个字段
操作说明: 现有rm_rule_storage表和rm_rule_storage1表。要将rm_rule_storage1表中的numbers、importance_level、rule_id三个字段的值赋给rm_rule_storage表中。两个表的关联是title相同。 title会存在前后空格,故加trim函数。 执行的sql语句如下: merge into rm_rule_stor...
java多线程下,并发更新数据时存在的安全问题,以及解决方案。
在实际项目中,往往会存在许多并发安全问题,以及并发访问效率问题。 比如,在多个用户同时更新同一条数据的时候,往往会出现线程安全问题,实际保存的数据和预期的并不相符。面对这种问题很多人第一时间会想到内置锁---->synchronized关键字,将方法体或者代码块锁住保证线程执行的同步。这样就能从根本上解决并发的线程安全问题。 但是,如果直接使用...
多线程update mysql的问题
@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class JunitTest { @Autowired private ProduceOrderRepository p; @Autowired private S...
mysql多线程update发生死锁
问题描述 mysql使用InnoDB引擎,在多线程并发的情况下,发现对数据库表中的数据进行更新操作时发生了死锁 基础知识 mysql 引擎 1、MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法。不是事务安全的,而且不支持外键,如果执行大量的select,i...
mysql 100个线程并发修改数据库某行记录,加锁不加锁结果分析
最近看到了mysql有行锁和表锁两个概念,越想越疑惑。为什么mysql要提供锁机制,而且这种机制不是一个摆设,还有很多人在用。在现代数据库里几乎有事务机制,acid的机制应该能解决并发调度的问题了,为什么还要主动加锁呢后来看到一篇文章,“防止更新丢失,并不能单靠数据库事务控制器来解决,需要应用程序对要更新的数据加必要的锁来解决”。瞬间,世界观都崩塌了。非常不敢相信,于是自己写了代码检验一下。数据库...
多线程抽取数据库数据,数据迁移
关键代码 2000万数据同步,每次查询20000分页,一分钟分钟之内全部塞入到队列里等待 log.info("房屋数仓数据同步调度开始!"); Date yesterday = null; HouseFeedbackCount hfb = getHouseFeedbackCountTime(21); if (hfb != null){ yester...
JAVA多线程实现数据库之间的数据互导、连接池、及多表插入数据库功能
做了个实现不同数据库的数据互导的工具实现了 td-->db2 db2-->td oracle-->td oracle-->db2 td-->oracle db2-->oracle td-->文件导出 db2-->文件导出 oracle-->文件导出 文件数据导入db2数据库 文件数据导入td数据库 启多线程实现了链接池功能,同一库单表、多表插入另一数据库的功能,文件到数据库...
MYSQL 使用存储过程批量更新表数据
DELIMITER //CREATE PROCEDURE `update_user`()  BEGIN DECLARE userId BIGINT; DECLARE openId VARCHAR(40); declare stop int default 0;  DECLARE cur CURSOR FOR (SELECT open_id,uid FROM user_map); /*  定义游标的...
对多线程对订单更新竞争的锁机制的实现-初构
做支付宝支付接入时遇到一个问题,对同一个订单,可能同时存在”支付宝服务器异步通知支付结果更新状态“和“用户主动要求发起查询支付结果更新状态"两个过程。因为在查询要用户已支付订单完成后要向其它系统发起交易请求,所以要求对同一订单,两个过程线程必须在更新时是同步执行的。但如果不区分的对整个更新方法加锁,则并发量又上不去。综合考虑,我决定自行实现一个锁机制,要求加锁后的更新方法做到以下要求:1、对不同的
spoon 查询数据向一张表插入数据 在更新另外两张表相应的字段
一个表输入,一个插入/更新 ,两个更新。 1,首先要编辑要连接的数据库信息 点击test 出现以下i提示的话 说明数据库连接成功 2,在’表输入‘中写入要查询的sql语句, 3,在插入/更新填写相应的信息 4,更新另外两张表的步骤 ...
java多线程操作两个数据库.
package com.dinglin; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Hashtable; import java.util.Vector; pub...
测试并发与优化多线程、大批量处理SQL性能的一些心得(有心得就会更新)
线程池的配置与并发优化处理,SQL优化性能的一些心得
MyBatis 动态修改多表数据
update product p join productcategory c on p.categoryId=c.id join productstock s on p.ProId=s.ProId <set> <if test="proName!= null "> p.ProName=#{proName} </if> &lt...
c#多线程网络请求,等待所有线程完成后更新UI
循环进行网络请求拉取用户信息(每个用户信息都需要一次网络请求),拉取完成后需要通知界面更新UI。实现方法是使用C#提供的ManualResetEvent,相当于一个标记,在每个线程中插入这个标记。再启动一个线程循环监听这个标记,直到所有线程都执行完毕则更新UI。
mysql 根据一个表数据更新另一个表的某些字段
DROP TABLE IF EXISTS T_U_TEMPLATE;-- 模版表CREATE TABLE T_U_TEMPLATE (  ID                    INT NOT NULL AUTO_INCREMENT comment '模版表ID',  TEMPLATE_CODE         VARCHAR(50) BINARY comment '模版编码',  TEMPL...
多线程并发操作数据库以及数据库升级
1 多线程并发操作数据库会导致数据库异常:          例1:cursor会为空的情况,打印cursor的时候不为空,使用的时候就为空了,原因考虑是,多线程操作数据库导致数据库异常          例2:提示正在尝试打开一个已经被关闭的数据库:在多线程访问数据库的时候会出现这样的异常: java.lang.IllegalStateException: Cannot perform th
更新表数据
表Arnaid namern001 1rn002 2rn003 3rn表Brnbid aid anamern1 001 1rn2 002 nullrn3 001 nullrn4 003 nullrn5 003 nullrnb.aid=a.aid b.aname=a.namern如何用一条SQl修改 b.aname=a.name 并且 b.aid=a.aid
ADO如何更新多个join表数据
用ADODataSet查询多表JOIN的数据,不用DBNavigator控件如何将多条修改记录更新回各自数据表?ADODataSet的CommandText值为:rnselect a.yqdh,a.ybbh,a.cdrq,a.xmdh,b.xmmc,c.zhdh,c.zhmc,a.xmcdz,rna.gdbj from lis_xmcdz a left join xt_xmb b on a.yqdh=b.yqdh rnand a.xmdh=b.xmdh left join xt_xmzh c on a.yqdh=c.yqdh and a.xmdh=c.xmdh where a.yqdh=:yqdh and a.ybbh=:ybbh rnand a.cdrq=:cdrq
Mysql中用表a中数据更新另一表b中数据的同时a的数据被修改
测试使用的隔离级别为Read Repeatable 建表和插入数据的SQL语句 create table test1(id int auto_increment primary key, no int, key(no)); create table test2(id int auto_increment primary key, no int, key(no)); insert
PHP多线程数据交叉存储 防止读取重复数据
今天碰到一个问题,PHP执行计划任务的时候出现了数据多次占用的问题。(首先声明代码是绝对没问题的。) 事例,程序中计划任务获取程序运单号推送订单到快递公司,每两个小时自动执行这个计划任务。 但是这样就可能会导致一个问题:暂且把第一次调用这个计划任务叫做任务A,第二次叫做任务B。 A执行的时候没有问题,但是可能执行A所花的时间比较长(本来需要时间很短,但受到各种因素影响),B开始执行的
pb数据窗口更新多个数据库表
利用pb的数据窗口更新多个数据库中的表。
PyQt5 多线程添加进度条
问题:点击<开始>按钮后加载模型计算,pyqt界面卡住等待计算结束。目的是添加进度条,优化用户等待。一开始以为添加进度条加上时钟就行,调试后发现把计算部分写在主界面类里,计算和进度条无法一起进行。 解决:需要把计算部分分离出去另起一个线程。 线程类的结构 以我程序所写的线程类为参考如下 from PyQt5.QtCore import * class MyCal(QThread): ...
SQL Sever 简单实现两张表之间的数据更新(存储过程)
需求介绍: 有两个相同的表,一个是主表A,有一部分数据被修改乱了,一个是新表B,由原来不乱的数据,还有一些新的数据。 A表需要根据B表进行更新。 要求: B表的每一条数据的idcard如果A表也有的话,则修改A表中的数据为B表数据,如果A表没有的话,则向A表插入该条数据。A表有,B表没有的数据则不改变。 A表、B表原始数据: 创建存储过程代码: CREATE PROCEDURE [dbo].[Q...
多线程查询MySQL大数据量单表导致OOM及线程卡死
1 需求 对数据进行迁移,需要将MySQL中的一张大表数据(亿级)读出并插入另一个数据库。 2 问题 对数据分组后,然后开启对应个数的线程,每个线程处理一个分组数据的任务(每个分组后的数据量从几十万至千万级),最初思路是从原库取出1000条数据后,再进入入库,设置了PreparedStatement 的 fetchSize为1000, 但是很快就报“ java.lang.OutOfMemoryEr...
多个事务并发执行update出现的数据库死锁问题排除
现象:死锁,时间:2017-08-3100:00:00.841,故障解决:按最小代价自行回滚事由:退优惠券,并发执行update语句.死锁日志(详细): Expand source** (1) TRANSACTION:TRANSACTION 6648945293, ACTIVE 0 sec starting index readmysql tables in use 3, locked 3LOCK...
mysql-两表级联同步更新两个表中的一列数据
项目说明: 近期我们所做的一个项目有以下的需求:表1:search_tutor  表2:pro_money_info 已知:search_tutor 其中一个字段的有一个导师的项目卡的余额:xmye           pro_money_info  其中也有一个字段:xmye 但是只有search_tutor里面的数据是从权威的地方拉过来的(财务处),所以项目xmye,在search_t...
多线程抓取数据
多线程抓取数据
将A表数据更新到B表
UPDATE xm_dwjy set areacode=a.area_code from sys_region a,xm_dwjy b where a.xm_areacode=b.areacode  
五个多线程同步应用小程序
Monitor Mutex EventWaithandle五个多线程同步应用小程序
【数据一致性】多线程写数据库,如何保持数据一致性?
无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。 如题,这种情况一般在数字类数据更新时需要保证万无一失,尤其是金额类的数字 比如小明的银行号有1000块钱 他做了一笔交易20元,很简单,我们要做一次更新 UPDATE XXX SET MONEY=NOWMONEY-20 W...
Oracle表数据的更新
对数据的修改操作,SQL提供了INSERT、UPDATE、DELETE对数据进行插入、修改、删除。 数据的插入 Demo:创建一张名为myemp表,将emp表的内容复制到myemp中 CREATE TABLE myemp AS SELECT * FROM emp; Demo:在表中插入一条数据 (当插入的数据包含表中全部字段时,字段声明部分可省略,字段赋值顺序需和表中字段顺序一致) INSER...
线程高并发分页获取数据处理数据更新数据(java)。
在处理大量数据的时候需要多线程处理查询的数据,为了避免死锁和等待。 可以使用分页的方式来查询和更新数据。 // 开启线程数量 //定义固定长度的线程池 防止线程过多 ExecutorService execservice = Executors.newFixedThreadPool(6); List<Callable<List...
同时update多张表的语句
昨天晚上在梦中有这样的场景:自行车爆胎了,修车师傅一边忙活,忽然回头对我说“你是做数据库的吧,考考你。用一条update语句怎么同时修改两张表?” wait4friend石化了几秒钟,然后下意识的给出一个答案。正确与否还不知道,然后就惊醒了。那么当时 wait4friend 给出的答案是啥呢?当时想到的是,利用key-preserved table这个特性来修改视图,达到同时更新多张表的目的。 ...
多个线程共享变量的初始化问题
一、问题背景:     写了一个USBManagerControl.dll动态库来监控USB设备的插拔事件,dllName.exe来加载调用USBManagerControl.dll。 部分代码如下: /************ dllName.exe部分代码 begin ************/ int main() {     hDllInst = LoadLibrary("U...
oracle 更新一个表的字段到更一个表里两种方法
方法1. 结合具体示例如下 UPDATE T_REPORT_MONTHLOGASLEVEL T   SET T.KEY1 =       (SELECT P.STRU_ORDER          FROM PUB_STRU P         WHERE P.STRU_LEVEL = 2           AND T.LEVEL_2_COMPANY = P.ORGAN_ALIAS) 方...
相关热词 c#异步发送kafka c#窗体编号 c# 操作二进制文件 c# 反射 机制 c#线程 窗体失去响应 c#角度转弧度 c# 解析gps数据 c# vs设置 语法版本 c# json含回车 c#多线程demo