@Async和@Transactional:不起作用 [英] @Async and @Transactional: not working

查看:219
本文介绍了@Async和@Transactional:不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请参阅代码.

  1. 当我调用方法@Async loadMarkUpPCT()时,数据未提交到表中.它的行为就好像是非牵引性的.

  1. When I called the method @Async loadMarkUpPCT(), data is NOT committed into the table. It behaves as if it's non-tractional.

当我从loadMarkUpPCT(Class 1)中删除@Async时(即非异步),则数据已提交并按预期正常:事务性)

When I removed @Async from loadMarkUpPCT (Class 1), i.e. non-async, then data is committed and OK as expected: transactional)

我期望使用@Async和@Transactional获得相同的结果,但事实并非如此.请解释或我做错了什么?

I was expecting to have the same result with @Async and @Transactional but it's NOT. Please explain or what did I do wrong?

已编辑:我刚编辑过以发布代码+登录

Edited: I just edited to post the code + log

按流: AppDataLoaderController调用AppDataLoaderService 调用DataMigrationService调用JpaDataMigrationDao

Flow-wise: AppDataLoaderController calls AppDataLoaderService calls DataMigrationService calls JpaDataMigrationDao

package concepts.web.rest.resource.spring.impl;

@Controller
@RequestMapping("/appdataloader")
public class AppDataLoaderController {

    @RequestMapping("/loadMarkupPct")
    @ResponseStatus(HttpStatus.ACCEPTED)    
    public void loadMarkUpPCT() {
        try {
            this.appDataLoaderService.loadMarkUpPCT();
        } catch (ServiceException e) {
            e.printStackTrace();
        }
    }



package concepts.service.impl;  

@Service("appDataLoaderService")
public class AppDataLoaderServiceImpl implements AppDataLoaderService {

    @Async
    @Override       
    public void loadMarkUpPCT() throws ServiceException {
        logger.debug("@Async loadMarkUpPCT");       
        dataMigrationService.loadMarkUpPCT();
    }   


package concepts.service.impl;

@Service
@Scope("prototype")
public class DataMigrationServiceImpl implements DataMigrationService {

    @Override
    public void loadMarkUpPCT() throws ServiceException {
        // TODO Auto-generated method stub
        Assert.notNull(markUpPCTDataLoader);
        List<MarkUpPCT> markUpPCTs=markUpPCTDataLoader.getMarkupCoef();
        for (MarkUpPCT markUpPCT: markUpPCTs)
            dataMigrationDao.storeMarkUpPCT(markUpPCT);
    }


package concepts.persistence.impl.jpa;

@Repository
public class JpaDataMigrationDao extends DataMigrationDaoAdapter{
    @PersistenceContext
    private EntityManager entityManager;

    @Transactional
    @Override
    public void storeMarkUpPCT(MarkUpPCT markUpPCT) {
        entityManager.persist(markUpPCT);

    }

一些日志

14 Nov 2013 18:47:05,531 36813 [http-bio-18080-exec-3] DEBUG OpenEntityManagerInViewFilter  - Opening JPA EntityManager in OpenEntityManagerInViewFilter
14 Nov 2013 18:47:05,578 36860 [http-bio-18080-exec-3] DEBUG DispatcherServlet  - DispatcherServlet with name 'mvc' processing POST request for [/POCQI/appdataloader/loadMarkupPct]
[http-bio-18080-exec-3] DEBUG RequestMappingHandlerMapping  - Looking up handler method for path /appdataloader/loadMarkupPct
[http-bio-18080-exec-3] DEBUG RequestMappingHandlerMapping  - Returning handler method [public void concepts.web.rest.resource.spring.impl.AppDataLoaderController.loadMarkUpPCT()]
[SimpleAsyncTaskExecutor-1] DEBUG DataMigrationServiceImpl  - @Async loadMarkUpPCT
[http-bio-18080-exec-3] DEBUG DispatcherServlet  - Null ModelAndView returned to DispatcherServlet with name 'mvc': assuming HandlerAdapter completed request handling
[SimpleAsyncTaskExecutor-1] DEBUG MarkUpPCTDataLoader  - {80=1.6, 90=1.8, 100=2.0, 105=2.05, 110=2.1, 115=2.15, 117=2.17, 120=2.2, 125=2.25, 150=2.5}
[http-bio-18080-exec-3] DEBUG DispatcherServlet  - Successfully completed request
[http-bio-18080-exec-3] DEBUG OpenEntityManagerInViewFilter  - Closing JPA EntityManager in OpenEntityManagerInViewFilter
[http-bio-18080-exec-3] DEBUG EntityManagerFactoryUtils  - Closing JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Opening JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Registering transaction synchronization for JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Closing JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Opening JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Registering transaction synchronization for JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Closing JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Opening JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Registering transaction synchronization for JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Closing JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Opening JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Registering transaction synchronization for JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Closing JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Opening JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Registering transaction synchronization for JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Closing JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Opening JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Registering transaction synchronization for JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Closing JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Opening JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Registering transaction synchronization for JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Closing JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Opening JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Registering transaction synchronization for JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Closing JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Opening JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Registering transaction synchronization for JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Closing JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Opening JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Registering transaction synchronization for JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils  - Closing JPA EntityManager

推荐答案

还尝试用@Transactional注释loadMarkUpPCT()方法,并告诉我们是否可行.

Try to also annotate the loadMarkUpPCT() method with @Transactional and tell us if that worked.

这篇关于@Async和@Transactional:不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆