Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spring中使用事务管理的代码有什么错误_Java_Spring_Jpa - Fatal编程技术网

Java 在Spring中使用事务管理的代码有什么错误

Java 在Spring中使用事务管理的代码有什么错误,java,spring,jpa,Java,Spring,Jpa,缺少什么以便我的事务可以工作 所以我刚刚发现带有Transaction的方法必须在自己的类中,并且该方法也应该是公共的。但不知何故,它在我的情况下仍然不起作用。我真的开始生气了 @Transactional(isolation=Isolation.READ_COMMITTED, propagation=Propagation.REQUIRED,readOnly=false,timeout=1000, rollbackFor=Exception.class) void saveUserAndHol

缺少什么以便我的事务可以工作

所以我刚刚发现带有Transaction的方法必须在自己的类中,并且该方法也应该是公共的。但不知何故,它在我的情况下仍然不起作用。我真的开始生气了

@Transactional(isolation=Isolation.READ_COMMITTED, propagation=Propagation.REQUIRED,readOnly=false,timeout=1000, rollbackFor=Exception.class)
void saveUserAndHoliday(User user, Holiday holiday)
{
    // At this point vacationDays of user is 27
    userDao.save(user); 
    // here vacationDays of user is 24
    holiday.setOvertime(null);
    holidayDao.save(holiday);
    //here exception is thrown so I would expect vacationsDays be rolled back to 27
}

有几个可能的原因导致它不能按预期工作

  • holidayDao.save(holiday)
    使用
    @Transactional(propagation=REQUIRES\u new)
    启动另一个新事务,因此在引发异常时已提交假日更改

  • 您是自调用的
    saveUserAndHoliday()
    ,以这种方式调用时,
    @Transaction
    将不会生效。此外,它仅适用于具有公共可见性的方法。(详情请参见本节)

  • 您使用的数据库存储引擎不支持事务,例如MySQL中的MyISAM


  • 你好,艾丽西亚。你能不能多花点时间写一篇文章,具体一点?谁是您代码(控制器、服务)的客户?您正在构建什么样的应用程序?只是春天吗?也许是弹簧靴?你是怎么做到的?另外,您使用的是哪种数据库?MySQL,Postgrel?H2?谢谢。如果您在方法所在的服务中使用方法@Transaction不工作,我只使用Spring。它在控制器中,一个私有方法这个方法是一个私有方法,或者包是可见的。它只在这个控制器类中使用。只是为了使它具有交易性,我应该将其公开。听起来很奇怪你说第一是什么意思?是的。您应该公开事务性方法,并且必须从另一个Springbean调用它,这就是AOP(基于封面下的@transactional的技术)在(1)中的工作方式,我的意思是holidayDao.save()也用@transactional注释,但根据需要配置它,这意味着,如果此方法成功完成,则另一个单独的新事务将在该方法执行和提交之前启动。如上所示,只有saveUserAndHoliday用Transactional注释。在这个方法中,会发生2个DAO调用。首先是userDAO.save,然后是holidayDAO.save。
    @Service
    public class MyService {
    
        UserDao userDao;
    
        HolidayDao holidayDao;
    
        public MyService(UserDao userDao, HolidayDao holidayDao)
        {
            this.userDao = userDao;
            this.holidayDao = holidayDao;
        }
    
        @Transactional(isolation=Isolation.READ_COMMITTED, propagation=Propagation.REQUIRED,readOnly=false,timeout=1000, rollbackFor=Exception.class)
        public void saveUserAndHoliday(User user, Holiday holiday)
        {
            userDao.save(user);     
            holiday.setOvertime(null);
            holidayDao.save(holiday);
        }
    }