弹簧数据JPA保存全部或全部保存和异常回滚



JpaRepository.save((的嵌套调用,要求是全部保存或不保存。

DAO 是:

@Entity
@Table(name = "A")
public class A implements Serializable{
}
@Entity
@Table(name = "B")
public class B implements Serializable{
}
@Entity
@Table(name = "C")
public class C implements Serializable{
}

存储库是:

public interface ARepository extends JpaRepository<A, String> {
}
public interface BRepository extends JpaRepository<B, String> {
}
public interface CRepository extends JpaRepository<C, String> {
}

假设 DAOService 层具有如下所示的方法:

persistA(){
persistB(b)
aRepository.save(a);
}
persistB(B b){
bRepository.save(b);
}
persistC(C b){
cRepository.save(c);
}
persistAll(){
persistA(a);
persistC(c);
}

这里的要求是所有数据库对象(A、B 和 C(仅保存为同一事务的一部分,这应该是新的。如果在保存任何对象期间发生异常(检查异常,因为运行时异常已经回滚了所有内容(,则不应保存任何内容。这意味着要么保存所有内容到数据库,要么不保存任何内容。

根据以下链接中共享的信息:

  1. https://www.ibm.com/developerworks/library/j-ts1/index.html
  2. https://www.baeldung.com/spring-transactional-propagation-isolation

我通过以下方式实现了这一点:

@Transactional(propagation  = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
persistAll(){
}
@Transactional(propagation  = Propagation.REQUIRED, rollbackFor = Exception.class)
persistA(){
}
@Transactional(propagation  = Propagation.REQUIRED, rollbackFor = Exception.class)
persistB(B b){
}
@Transactional(propagation  = Propagation.REQUIRED, rollbackFor = Exception.class)
persistC(C c){
}

有没有办法检查是否使用相同的事务来保存 A、B 和 C。

另外,我想知道以下代码片段是否

@Transactional(propagation  = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
persistAll(){
}
@Transactional(propagation  = Propagation.REQUIRED, rollbackFor = Exception.class)
persistA(){
}
@Transactional(propagation  = Propagation.REQUIRED, rollbackFor = Exception.class)
persistB(B b){
}
@Transactional(propagation  = Propagation.REQUIRED, rollbackFor = Exception.class)
persistC(C c){
}

相当于:

@Transactional(propagation  = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
persistAll(){
}

persistA(){
}
persistB(B b){
}

persistC(C c){
}

您无法获取事务 ID 或类似内容。但是你可以检查Spring Transaction是否开始了一个新的交易:

TransactionAspectSupport.currentTransactionStatus().isNewTransaction();

因此,在persistAll()中,这应该返回 true,而在所有其他方法中返回 false。

最新更新