【问题标题】:maintaining data consistency in spring在春季保持数据一致性
【发布时间】:2017-10-14 13:52:07
【问题描述】:

我有一个场景,我必须将数据插入到多个表中。如果一个查询失败,那么我想回滚最后一个执行的查询

我的服务方法是

@Service
@Transactional
public class ServiceNameImpl implements ServiceName{
    @Autowired
    private ABCRepository abcRepository;

    @Autowired
    private BCDRepository bcdRepository;

    @Override
    public SChResource save(SchData schData){
        SchSch sch = new SchSch();
        Contact con = new Contact();
        sch.setName(schData.getName());
        abcRepository.save(sch);  --first insertion
        con.setAddress(schData.getAddress());
        bcdRepository.save(con);  --second insertion
        return null;
    }
}

我希望如果第一次插入执行并且第二次插入失败,那么第一次插入将回滚,如果第一次插入失败并且第二次插入执行,那么第二次插入将回滚。

请建议我该怎么做。

【问题讨论】:

  • 看起来您想让save() 方法具有事务性。
  • 这应该已经可以工作了,因为您的服务是 @Transactional 如果它不起作用,那么这个问题包含的信息太少,无法回答您的问题。
  • @M. Deinum 我对应该使用@Transaction(readOnly=true) 或@Transactional(readOnly=false) 感到困惑。因为在这个服务类中还有一些其他方法我不想让它们成为事务性的
  • @Kayaman 是的,我想让我的保存方法具有事务性。但是这个服务类中还有一些其他的方法,我不想让它们成为事务性的
  • 我没有告诉你让其他方法具有事务性,是吗?将注释放在方法而不是类上。然后阅读文档,这样您就不必对 Spring 的工作原理感到困惑了。

标签: java spring hibernate repository spring-data-jpa


【解决方案1】:

我认为您正在使用 Spring data Jpa 并在您的 ABCRepositoryBCDRepository 中扩展 JpaRepository 或其父类或子类。

在这种情况下,您还需要在任何具有@Configuration 的班级上添加@EnableTransactionManagement

【讨论】:

  • 是的,我正在扩展 JpaRepository,但没有得到你提到的第二点
  • 你是否使用了EnableTransactionManagement注解,如果不使用它应该可以工作,你可以在任何有配置注解的类上使用这个方法。
  • 可能在您的 applicationcontext.xml 文件中缺少注释驱动的事务激活。 <tx:annotation-driven/>
【解决方案2】:

注意@Transactional 注释。您应该使用包org.springframework.transaction.annotation,而不是javax.transaction。它没有出现在您粘贴的代码sn-p中,但是我过去遇到过这个错误,这就是为什么我认为这里是这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 2019-11-24
    • 2013-03-23
    • 2013-11-12
    • 1970-01-01
    相关资源
    最近更新 更多