Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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
Spring 当外部事务失败时,如何使内部事务回滚_Spring_Spring Boot_Jpa_Spring Data Jpa_Transactions - Fatal编程技术网

Spring 当外部事务失败时,如何使内部事务回滚

Spring 当外部事务失败时,如何使内部事务回滚,spring,spring-boot,jpa,spring-data-jpa,transactions,Spring,Spring Boot,Jpa,Spring Data Jpa,Transactions,我想创建一个名为createTransaction的方法,如果事务成功,它将提交该事务,但如果事务失败,则回滚某个表中的所有事务。另一方面,我希望将事务日志保存到db中,即使它失败或成功 我尝试过这段代码,但当我尝试输入一个未保存在db中的customerId时,事务应该回滚到事务、产品和客户实体,但它仍然在产品表中提交事务。有人能告诉我发生了什么事并给我解决办法吗 public String createTransactionWithLog(TR_Transaction transaction

我想创建一个名为createTransaction的方法,如果事务成功,它将提交该事务,但如果事务失败,则回滚某个表中的所有事务。另一方面,我希望将事务日志保存到db中,即使它失败或成功

我尝试过这段代码,但当我尝试输入一个未保存在db中的customerId时,事务应该回滚到事务、产品和客户实体,但它仍然在产品表中提交事务。有人能告诉我发生了什么事并给我解决办法吗

public String createTransactionWithLog(TR_Transaction transaction) {
    String message = "";
    try {
        
        boolean successTransaction = createTransaction(transaction);
        if(successTransaction == true) {
            message = "Transaksi sukses";
        }else {
            message = "Transaksi gagal";
        }
        
    }catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }finally {
        Activity_Log log = new Activity_Log(LocalDateTime.now(), "DoTransaction", message);
        activityLogRepository.save(log);
    }
    
    return message;
    
}

@Transactional
public boolean createTransaction(TR_Transaction transaction) {
    long productId = transaction.getProductId();
    long customerId = transaction.getCustomer().getCustomerId();
    
    MS_Product product = productRepository.getOne(productId);
    MS_Customer customer = customerRepository.getOne(customerId);
    
    if(product == null || customer == null) {
        return false;
    }else {
        transaction.setCustomer(customer);
        
        int newProductStock = product.getProductStock() - transaction.getQuantity();
        product.setProductStock(newProductStock);
        
        transaction.setProductPrice(newProductStock);
        
        customer.getTransactions().add(transaction);
        
        TR_Transaction savedTransaction = transactionRepository.save(transaction);
        MS_Customer updatedCustomer = customerRepository.save(customer);
        MS_Product updatedProduct = productRepository.save(product);
        
        return true;
    }
}

你用的是什么数据库?我用的是h2数据库。这有关系吗?失败时提交哪一行
createTransaction
?失败时是否引发异常?第二个createTransaction,我应该如何处理异常这是标准嵌套事务的行为。请尝试嵌套内部事务。由于我不熟悉Java和h2数据库,请自己尝试一下您使用的是什么数据库?我使用h2数据库。这有关系吗?失败时提交哪一行
createTransaction
?失败时是否引发异常?第二个createTransaction,我应该如何处理异常这是标准嵌套事务的行为。请尝试嵌套内部事务。由于我对Java和h2 db不熟悉,请自己试试