Spring事务重试

时间:2015-06-18 05:22:20

标签: spring jpa spring-transactions

环境

Spring 4.0.3

JPA:2.1,底层实现Hibernate 4.3.5.Final

这是我的应用程序中的伪代码。

@Transactional
doRegistration() {

    //user insert
    entityManager.persist(userObj); 

    //user permission insert
    entityManager.persist(permissionObj);   

    //find the max id from address table
    maxId = entityManager.findAddressMaxId(userObj.userid)

    id = maxId + 1;
    //other business logics goes here

    //insert user address with id
    entityManager.persist(addressObj);
}

我的系统中有多个这样的代码块,它们为新id执行最大+1。

有些情况下可能会发生竞争。在这些情况下,由于主键冲突,addressObj插入可能会失败。

我厌倦了@GeneratedValue,在这种情况下的问题是,有一个外部系统对这些表进行相同的注册。除此之外,在某些情况下,我的遗留数据库使用char数据类型作为id。

最不希望添加一些代码级别的更改,以便在异常情况下再次执行地址插入。

org.springframework.transaction.annotation.Transactional中是否有任何选项可以让该方法在没有回滚的情况下再次尝试?

其他想法也是最受欢迎的。

0 个答案:

没有答案