首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring事务管理器和多线程

Spring事务管理器和多线程
EN

Stack Overflow用户
提问于 2013-05-30 12:19:45
回答 3查看 15.1K关注 0票数 3

我使用可调用接口在serviceImpl中编写多线程程序,我使用spring事务manager.When更新操作在DB中执行,它成功地执行.But,更新后的数据没有反映在DB.中,但是当我运行没有多线程的程序时,它是在DB中更新的。

这是我的配置

代码语言:javascript
复制
<tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="*" />
            <tx:method name="find*" propagation="NOT_SUPPORTED" />
            <tx:method name="get*" propagation="NOT_SUPPORTED" />
        </tx:attributes>
    </tx:advice>
    <aop:config>
        <aop:pointcut id="serviceOperation" expression="execution(* *..*ServiceImpl.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation" />
    </aop:config>
    <bean id="txManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

我可以转向另一种用于事务manager.Just的方法,我想确认这种方法是否支持多线程。因此,我的问题是,spring事务管理器支持多线程(我的意思是声明注释或XML ),为什么在我的例子中更新的数据没有反映在DB中?,什么是最好的替代方法?

EN

回答 3

Stack Overflow用户

发布于 2013-05-30 12:24:12

Spring使用的事务上下文存储在线程局部变量中。因此,如果您启动一个新线程,或者使用可调用的方法在另一个线程中执行代码,则此代码将不会是Spring事务方面启动的事务的一部分。这就是为什么您的数据没有出现在数据库中。

票数 22
EN

Stack Overflow用户

发布于 2013-05-31 03:26:38

你已经展示了你是如何做多线程的,所以我只能猜到你做了什么:

在YourService.doSomething()中,它是createThreads。对于每个线程,它都执行与DB相关的操作。是那么回事吗?

正如在另一个答案中描述的那样,事务上下文以线程本地方式存储。因此,线程中的逻辑与任何事务都没有关联。您可以验证的一件事是,除了线程中的逻辑之外,在doSomething()中还可以执行一些DB操作。您将发现在doSomething()中执行的db操作是提交的,而线程中的操作则丢失了。

合理的解决方法之一是,通常我们有一个作为工作单元的应用程序服务层,因此,我们在它上有事务边界(类似于您的服务)。您的线程应该调用服务提供的操作。当然,它们都将处于不同的交易中。

如果您希望它们都在一个事务中,另一种方法是,不让单个线程执行DB操作,线程现在执行繁重的工作,并将结果回发到原始线程(例如,由生产者-消费者队列)。原始线程负责收集结果并执行DB操作。

就我个人而言,我试图避免在不同线程之间手动传递事务上下文。这只是破坏了声明性事务的整个想法。

票数 3
EN

Stack Overflow用户

发布于 2017-02-01 13:29:48

您可能希望在Spring中实现自己的TransactionSynchronizationManager并注入它。使用类似于InmheritableThreadLocal的东西,而不是ThreadLocal。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16835974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档