`
cloudtech
  • 浏览: 4614197 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

Spring里多线程共享事务的问题

 
阅读更多

最近做Performance Tuning, 有一个功能,在用户点击后要做两次数据库存储,而且还要发送好几条JMS message,造成反应极慢。所以我考虑用FutureTask来并发做几件事情,我在service层里新建FutureTask。写完后,测试发现除了还在原来主线程中的数据库操作外,其他数据库,message操作通通变成不受事务控制的了。

研究Spring源代码,发现原来Spring事务是通过ThreadLocal类来实现的,在TransactionSynchronizationManager中有两个方法:

public static void bindResource(Object key, Object value) throws IllegalStateException

public static Object getResource(Object key)

分别用来绑定和获得对应线程的事务控制实例。所以对于不同的线程,默认来说肯定会有不用的事务控制。我们的事务控制是通过aop加在service层上的,所以只有那个主线程才有事务,而后来创建的FutureTask由于没有经过AOP的代码,所以就没事务控制了。

问题:能把同一事务控制加到多个线程中吗?理论上是可以的,我们可以在创建线程前在主线程中通过getResource方法把对象获取出来,传入新创建的线程,让后用bindResource方法绑定上去。这样会有问题吗?上网查了下,发现还是有潜在问题的,因为数据库的操作,只支持单线程下保证事务正确,如果多个线程操作同一事务就会出问题,要保证不出错,就必须确保更新数据库的方法是同步的,也就是一次只能一个线程操作数据库(想想还是挺麻烦的,因为我们现在都用spring的template)。但是如果事务是JTA的呢,因为操作的是不同的数据库,或者数据库和JMS(我们的数据库操作和JMS不在同一事务中,以后有时间可以谈谈),是不是就可以同步操作呢?

我想应该是可以的吧,对于事务扩展到多个线程的问题,都是我的猜想,有空大家可以去试试。哪位如果认为我说的不对,欢迎指点!!

分享到:
评论

相关推荐

    spring boot注解事务+多线程

    spring boot 纯注解方法事务控制回滚,注解+简单配置文件使用多线程demo

    Spring声明式数据库事务的使用-隔离级别

    首先是隔离级别,因为互联网时刻存在着高并发的环境,如商品库存,时刻都是多个线程共享的数据,这样就会在多线程的环境中扣减商品库存。对于数据库而言,时刻都是多个事务同时访问同一记录的情况,这样引起数据出现...

    java面试笔试资料包括JAVA基础核心知识点深度学习Spring面试题等资料合集.zip

    JAVA多线程之线程间的通信方式.docx Java注解详解.docx Java线程池.docx JDK1.8Stream操作.docx JDK8有新特性.docx JVM堆三代.docx JVM的垃圾回收机制详解和调优.docx Spring源码分析之IoC.docx 关于线程和线程池的...

    免费开源!!高级 Java Redis 客户端,用于线程安全同步、异步和反应式使用 支持集群、哨兵、管道和编解码器

    如果多个线程避免阻塞和事务性操作(例如BLPOP和 MULTI/ ) ,则它们可以共享一个连接EXEC。Lettuce是用netty构建的。支持高级 Redis 功能,例如 Sentinel、集群、管道、自动重新连接和 Redis 数据模型。 此版本的 ...

    java面试题

    答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式允许其service方法,一个实例可以服务于多个请求,并且其实例一般不会被销毁,而CGI对每个请求都产生新的进程,服务完后就销毁,所以效率上...

    JAVA高并发高性能高可用高扩展架构视频教程

    java多线程编程 纯手写实现SpringIOC实现过程 JEE企业级开发(企业级项目开发权威指南) 网络爬虫之JAVA正则表达式 手写springMVC框架 老司机带你透析springMVC内部实现方式 打造高效代码结构(java性能优化) 新版本...

    达内java培训目录

    JavaSE核心 异常处理、多线程基础、IO系统、网络编程、Java反射机制、JVM性能调优(JVM内存结构剖析、GC分析及调优、JVM内存参数优化)、Java泛型、JDK新特性 熟练掌握JavaSE核心内容,特别是IO和多线程;...

    千方百计笔试题大全

    70、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 17 71、启动一个线程是用run()还是start()? 17 72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73...

    java面试宝典

    70、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 17 71、启动一个线程是用run()还是start()? 17 72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73...

    java+大数据(1).pdf

    刚开始我们会详细讲解⼯具的使⽤(eclise,idea ,Toad 等常⽤的开发⼯具) java基础(45天)其中(其中 java⽹络编程 ,多线程 ,java NIO ,java lambda 这⼏个java模块⼤数据中需要⽤到,我们重点讲解,为⽇后学习⼤...

    Java测试新技术TestNG和高级概念.part1

    2.5 测试多线程代码 2.6 性能测试 2.7 模拟和桩 2.8 依赖的测试 2.9 继承和annotation范围 2.10 测试分组 2.11 代码覆盖率 2.12 本章小结 第3章 企业级测试 3.1 典型企业级场景 3.2 一个具体例子 3.3 测试实现 ...

    Java测试新技术TestNG和高级概念.part2

    2.5 测试多线程代码 2.6 性能测试 2.7 模拟和桩 2.8 依赖的测试 2.9 继承和annotation范围 2.10 测试分组 2.11 代码覆盖率 2.12 本章小结 第3章 企业级测试 3.1 典型企业级场景 3.2 一个具体例子 3.3 测试实现 ...

    基于SSM架构实现的大型分布式购物网站-B2C项目源码+项目说明.zip

    方案2:在负载均衡服务器中运行一个精灵线程,预测服务器压力过大时会自动把session转移压力过小的服务器中。 3、做专门的图片服务器。使用一个http服务器,Apache.或者Nginx。使用ftp服务上传图片,vsftpd ##...

    jeesuite-libs-其他

    (一个应用多个redis server)分布式模式开关kafka模块基于spring封装简化配置和调用方式基于配置新旧两版Consumer API兼容支持支持二阶段处理,即:fetch线程同步处理和process线程异步处理消费成功业务处理失败...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    Java的产生与流行是当今Internet发展的客观要求,Java是一门各方面性能都很好的编程语言,它的基本特点是简单、面向对象、分布式、解释的、健壮的、安全的、结构中立的、可移植的、性能很优异的、多线程的、动态的,...

    JAVA上百实例源码以及开源项目

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    JAVA上百实例源码以及开源项目源代码

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    基于J2EE框架的个人博客系统项目毕业设计论...

    Java的产生与流行是当今Internet发展的客观要求,Java是一门各方面性能都很好的编程语言,它的基本特点是简单、面向对象、分布式、解释的、健壮的、安全的、结构中立的、可移植的、性能很优异的、多线程的、动态的,...

    asp.net知识库

    如何解决ACCESS中SELECT TOP语句竟然返回多条记录的问题? Asp.net 利用OleDb的GetOLEDBSchemaTable方法得到数据库架构信息 用于 Visual Studio .Net 的 IBM DB2 开发外接程序 第2章 并发操作的一致性问题 (2) Using...

Global site tag (gtag.js) - Google Analytics