spring事务-多线程更新多个表数据

问题描述

多线程更新多个表数据

更新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);
    }
    ...

解决方案

只要不多表连查就行。

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

时间: 2025-01-07 18:52:37

spring事务-多线程更新多个表数据的相关文章

PHP实现更新中间关联表数据的两种方法_php技巧

本文以示例形式展示了PHP实现更新中间关联表数据的两种方法.分享给大家供大家参考之用.具体方法如下: 首先,中间关联表:这里的中间表只存表1的主键和表2的主键,即多对多的形式. 执行数据添加和删除为框架内部方法,不属于思路部分. 方法一:先全部删除旧数据,后添加新数据 $res = $this->classes->classEdit($id, $data); //修改主表数据 if($res) { //先删除关联表数据 $bool = $this->lesson_classes->

使用delphi 开发多层应用(九)客户端使用事务更新多个表数据到kbmMW服务器

  上次说明了客户端如何把变化的数据更新到服务器端,但是在实际应用中,往往是要同时更新若干个表, 为了保证逻辑上一致,这些表的操作要么都一次成功,要么全部失败,这就需要使用事务处理.我们今天 就来说一下,怎么在kbmMW中实现事务处理.同时也顺便讲一下kbmMW 里面命名查询(named query)的 使用,首先我们打开服务器端,在数据服务上增加一个TkbmMWIBDACQuery,如图 设置它的connctionpool 为Form1.kbmMWIBDACConnectionPool1 re

hibernate表记录更新引发连接表数据被删问题

问题描述 我的项目中有两个表document.level,它们之间通过连接表实现关联,映射文件如下:表document<hibernate-mapping> <class name="com.unionmon.knowledge.model.KleDocument" table="KLE_DOCUMENT" schema="UFLOW"> <id name="kleDocumentId" type

spring mvc 事务,操作多张表的时候,异常不回滚,求大神帮忙啊

问题描述 spring mvc 事务,操作多张表的时候,异常不回滚,求大神帮忙啊 @Override @Transactional(rollbackFor=Exception.class) public Boolean saveXkcq(String qian,String xh, Xk_cqb cqb, Rw_xkb rwXkb, Xk_xkb xkb) { Boolean type = false; try { if(qian!=null && qian.length()>0){

数据-spring mvc多线程问题。

问题描述 spring mvc多线程问题. 问题是这样的,有一个车库,他有六个监控,如何每隔1分钟调用六个监控摄像头,采集过往车辆的数据,并保存到数据库中,如何采集数据不用考虑,思路是怎样的,是要用到监听器吗,ThreadLocal如何实现 解决方案 就是循环摄像头,然后拿到图像,然后入库,你这是主动去要,而不是推送 解决方案二: 客户端的多线程和spring没有任何关系.每个请求发送来,分配线程是不要你操心的. 解决方案三: 主动采集不要放在web程序中,再做一个客户端比较好. 解决方案四:

编程-VFP 更新表数据时自动把系统时间写入表中指定一列插入 如何实现自动写入数据

问题描述 VFP 更新表数据时自动把系统时间写入表中指定一列插入 如何实现自动写入数据 VFP编程 现有 成绩 用户 两表 成绩表 三列 成绩 修改时间 用户 用户表 两列 用户名 密码 其中插入与更新成绩后,自动提取系统时间 写入 "修改时间列"( 包含年月日的时间 ) 并且根据系统登录的用户,将用户名写入成绩表 用户列 修改时间以及 用户 这两列只能通过程序自动写入 不可以人为写入 现有两表 教师 用户 如何实现插入教师表中教师号一列的数据后 自动将数据插入到用户表中 用户名列 用

mysql两表数据匹配,更新结果为什么为0

问题描述 mysql两表数据匹配,更新结果为什么为0 update crm_customerhr_postset crm_customer.beseats_depid=hr_post.dep_idcrm_customer.beseats_depname=hr_post.depnamewhere hr_post.emp_id=crm_customer.BeSeats 解决方案 0就是没有数据更新呗,没有符合条件的数据吧 解决方案二: 字段名合适的没?表里边有没有这些字段

access数据库-Access2010 如何将窗体中未绑定文本框的输入值更新到对应的数据表中

问题描述 Access2010 如何将窗体中未绑定文本框的输入值更新到对应的数据表中 前提:创建了个数据表A(栏1,栏2,栏3),用此表生成了窗体A,表A中每项记录跟窗体A相对应,一边有记录更新时,另一边自动更新.现在窗体A上创建了一个未绑定的文本框,用于输入当前用户名. 目的:当在窗口更新记录时,可以将当前用户名一起保存到数据表中(已在表A中创建 栏4:当前用户). 请问:如何在窗体A上手动录入一组数据记录时,将文本框中的当前用户名更新到数据表A中. 刚接触Access,不太了解,多谢了.

更新-thinkphp修改bit类型表数据,只能从0修改成1,不能从1修改成0

问题描述 thinkphp修改bit类型表数据,只能从0修改成1,不能从1修改成0 如题,tp3.2.2版本,用tp修改User表数据时,sex字段用bit类型,0代表女,1代表男,页面用radio类型单选框,在修改页面能够获取数据库中的数据并显示,但在修改时,只能从女修改成男,不能从男修改成女.前者提示修改成功,数据库中数据也更新,后者提示失败,数据库中数据不更新 解决方案 $sex='0'; $data['sex']=(bool)$sex; $M->save($data); 解决方案二: $