我正在尝试制定一个示例 Spring Boot(MVC) 项目,我正在尝试以相同的顺序执行以下操作。添加一位客户添加具有客户 ID 的联系人添加具有客户和联系人 ID 的 Oppr向联系人发送电子邮件添加具有 opprId 的票证这里的主要问题是我试图在一笔交易下完成所有任务。但是添加票的方法在另一个类中。在尝试添加票时,我需要将 opprId 发送到 TicketAdd 类。当我不在方法级别使用@Transaction 时,我能够获取全局变量值,但目前我在 AddTicket 类中使用 @Transaction 来获取 addFields 方法,然后无法获取全局变量的值。这是我的 OpprAdd 服务类。package com.transaction.spring.service;import java.util.Date;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Propagation;import org.springframework.transaction.annotation.Transactional;import org.springframework.ui.Model;import org.springframework.web.servlet.ModelAndView;import com.transaction.spring.model.Customer;import com.transaction.spring.model.CustomerContact;import com.transaction.spring.model.SalesOppr;import com.transaction.spring.repo.ContactRepo;import com.transaction.spring.repo.CustomerRepo;import com.transaction.spring.repo.OpprRepo;@Servicepublic class OpprAdd { @Autowired ContactRepo contactRepo; @Autowired CustomerRepo customerRepo; @Autowired OpprRepo opprRepo; @Autowired TicketAdd ticketAdd; public ModelAndView getModelAndView(Model model, ModelAndView modelAndView) { modelAndView.addObject("SalesOppr", new SalesOppr()); modelAndView.setViewName("enquiry-add"); return modelAndView; } public ModelAndView postModelAndView(Model model, SalesOppr SalesOppr, ModelAndView modelAndView) { addOppr(SalesOppr); modelAndView.addObject("SalesOppr", SalesOppr); modelAndView.setViewName("enquiry-add"); return modelAndView; } private void sendEmailSms(SalesOppr SalesOppr) { System.err.println("123"); } @Transactional(propagation = Propagation.REQUIRES_NEW) public void addOppr(SalesOppr SalesOppr) { Customer Customer = new Customer(); Customer.setCustomerName(SalesOppr.getCustomerName()); customerRepo.save(Customer); }}
2 回答
12345678_0001
TA贡献1802条经验 获得超5个赞
代替
@Transactional(传播=传播.REQUIRES_NEW)
尝试
@Transactional(传播=传播.支持)
解释:
REQUIRES_NEW:
表示每次调用目标方法时都必须启动一个新的 tx。如果已经有一笔交易正在进行,它将在开始新的交易之前暂停。
支持:
表示目标方法可以执行,而与 atx 无关。如果 atxis 运行,它将参与相同的 tx。如果在没有 tx 的情况下执行,如果没有错误,它仍然会执行。获取数据的方法是此选项的最佳候选者。
临摹微笑
TA贡献1982条经验 获得超2个赞
正如我从下面的代码中看到的:
ticketAdd.ticketOwner = "1"; ticketAdd.ticketOpprId = String.valueOf(SalesOppr.getOpprId()); ticketAdd.addFields();
所做的更改ticketAdd
未保存/提交。
因此,当您读取其他类中的值时,由于@Transactional
. 因此,请尝试以下操作:
@Transactional(isolation=Isolation.READ_UNCOMMITTED) public void addFields() { System.out.println("ticketOwner====" + ticketOwner); System.out.println("ticketOpprId====" + ticketOpprId); }
我希望它有效。
添加回答
举报
0/150
提交
取消