@Async和@Transactional:不工作

时间:2013-11-12 17:23:50

标签: spring spring-transactions

请参阅代码。

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

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

  3. 我期望与@Async和@Transactional有相同的结果,但它不是。请解释或我做错了什么?

    编辑:我刚编辑发布代码+日志

    流量明智: AppDataLoaderController调用AppDataLoaderService 调用DataMigrationService调用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
    

2 个答案:

答案 0 :(得分:2)

尝试使用loadMarkUpPCT()注释@Transactional方法并告诉我们这是否有效。

答案 1 :(得分:0)

我碰到了同样的问题。原来我忘了添加@EnableAsync注释。