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不在同一事务中,以后有时间可以谈谈),是不是就可以同步操作呢?

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值