当前位置: 首页 > 知识库问答 >
问题:

@不同步和@事务:不工作

宋朝
2023-03-14

请参阅代码。

>

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

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

    我希望@Async和@Transactional的结果是一样的,但事实并非如此。请解释一下,我做错了什么?

    编辑:我刚编辑过代码日志

    流程方面:AppDataLoaderController调用AppDataLoaderService调用DataMigrationService调用JPadatMigrationDao

    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个答案

    丁弘新
    2023-03-14

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

    牟嘉
    2023-03-14

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

     类似资料:
    • 这个练习直接来自SCJP,由凯西·塞拉和伯特·贝茨完成 同步代码块 在这个练习中,我们将尝试同步一个代码块。在该代码块中,我们将获得对象的锁,以便其他线程在代码块执行时无法修改它。我们将创建三个线程,它们都将尝试操作同一对象。每个线程将输出一个字母100次,然后将该字母递增一次。我们将使用的对象是StringBuffer。 我们可以在一个String对象上进行同步,但是字符串一旦创建就不能被修改,

    • 我试图通过在一个事务中运行多个save方法来原子化地保存许多实体,因此如果其中任何一个方法失败,所有这些方法都将被丢弃(回滚)。我尝试了很多方法,但似乎没有什么效果: BookingResource。java: ReservationRepository。java: Reservation.java: stacktrace是: 那么,这里发生了什么?我如何解决它?我试图公开这些方法,更改事务策略,

    • 问题内容: 我正在使用同时使用JMS和Hibernate的独立应用程序。 该文档建议,如果我想同时使用这两种资源进行事务处理,则必须使用JTA。 但是,现在使用带有@Transaction注释的DAO方法(和HibernateTransactionManager),这似乎已经可以工作。当我在JmsTemplate上调用send()时,消息不会立即发送,而是随着方法的返回,使用Hibernate会话

    • 嗨,我正在尝试开发带有事务的spring和hibernate应用程序,我正在使用Spring4。x和hibernate 4。下面是我的代码片段 应用程序上下文。xml servlet上下文。xml 坚持。xml finnaly meservice看起来像这样 和 这里会发生运行时异常,但db记录没有回滚。

    • 使用log4j2,我很难让同步记录器和异步记录器一起工作。 从这里以Apache文档(标题为混合同步和异步记录器)为例,运行下面的应用程序将简单地创建日志文件,但不向其写入任何内容。我也不确定添加两个记录器指向同一个appender,但它的Apache留档,所以我假设这是好的。 LOG4J2配置 pom.xml 应用 但是,如果我更改log4j2配置并修改loggers元素以读取以下内容,我将在日

    • 我是一个新的Spring和学习的事务概念。无法使@Transactional工作。 用例: 当getEmployee()抛出RuntimeException时,员工和员工详细信息的数据插入应该回滚。但回滚没有发生。我使用的是Oracle数据库11g和spring 4.3.1版本。下面是正在运行的独立java代码。