Transactions Spring为@transactional提供的传播行为 @控制器 公共类MyControllerClass{ @自动连线 私人MyService服务; 公共SomeResponse调用服务方法(SomeRequest reqObj){ 试一试{ //代码行 服务。服务方法(reqObj); //代码行 }捕获(例外情况除外){ S.O.P(“在控制器的调用服务方法中捕获 类别);; } } 公共接口MyService{ SomeResponse服务方法(SomeRequest reqObj); } @服务 公共类MyServiceImpl实现了MyService{ @自动连线 私人雇员道恩帕道; @自动连线 私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人; @自动连线 私有MetadataDAO-metaDAO; @事务性(value=“事务管理器\u Bean\u名称”) 公共SomeResponse服务方法(SomeRequest reqObj){ List personList=..;//从中获取人员列表 //Rekobj List Employist=……;//获取员工列表 //来自Rekobj SomeHelper SomeHelper=新的SomeHelper(empDAO、personDAO、, metaDAO); 试一试{ 操作人员(…); 员工(…); doOperationMetadata(…); }捕获(例外情况除外){ S.O.P(“在Impl类的serviceMethod中捕获”); } } @事务性(value=“事务管理器\u Bean\u名称”) 公共无效操作人员(列表人员列表, 列出个人、某人助手(某人助手){ personList.stream().forEach(person->{ 试一试{ someHelper.PerformTaskPerson(person,personErrors); }捕获(例外情况除外){ S.O.P.(“被发现在Impl的操作人员内 类别);; add(例如getMessage()); } } } @事务性(value=“事务管理器\u Bean\u名称”) 公共无效操作员工(列表员工、, 列出错误,SomeHelper SomeHelper){ empList.stream().forEach(emp->{ 试一试{ 一些助手。执行任务的员工(emp、empErrors); }捕获(例外情况除外){ S.O.P.(“被发现在Impl的员工内部 类别);; add(例如getMessage()); } } } @事务性(value=“事务管理器\u Bean\u名称”) public void doOperationMetadata(SomeOtherData元数据, 列表元数据列表,SomeHelper SomeHelper){ empList.stream().forEach(emp->{ 试一试{ PerformTaskMetadata(元数据, 元数据列表); }捕获(例外情况除外){ S.O.P(“被发现在Impl的DoOperationMetadata中 类别);; add(例如getMessage()); } } } } 公共类助手{ 私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人; 私人雇员道恩帕道; 私有MetadataDAO-metaDAO; 一些助手(PersonDAO PersonDAO、EmployeeDAO empDAO、MetadataDAO metaDAO){ this.personDAO=personDAO; this.empDAO=empDAO; this.metaDAO=metaDAO; } @事务性(value=“事务管理器\u Bean\u名称”, 传播=传播。需要(新) 公共作废绩效任务员工(员工emp,列表 皇帝){ EmpEntity EmpEntity=empDAO.getEmployee(emp); emperity.setName(…); //更新其他字段 } @事务性(value=“事务管理器\u Bean\u名称”, 传播=传播。需要(新) public void performtaskoneemployee(个人,列表 (人事代表){ PersonEntity perEntity=personDAO.getPerson(person); perEntity.setName(…); //更新其他字段 } @事务性(value=“事务管理器\u Bean\u名称”, 传播=传播。需要(新) public void performTaskOnMetaData(SomeOtherData元数据, 列表元数据列表){ 元实体MetaEntity=metaDAO.getOther(元数据); 集合名(…); //更新其他字段 } }
当somehelper类中的任何方法(将传播行为设置为'requires_new'的事务块)发生异常时,为什么调用方类中没有处理它(具有默认传播行为的事务块)?而不是看到消息“捕获到Impl类的DoOperationMetadata中”,我收到消息“Catch in callServiceMethod of Controller class”。如果问题是如果底层方法中出现异常,是否可以在外部方法中发生事务回滚,则答案是否定的,因为每个方法都将被视为独立的事务Transactions Spring为@transactional提供的传播行为 @控制器 公共类MyControllerClass{ @自动连线 私人MyService服务; 公共SomeResponse调用服务方法(SomeRequest reqObj){ 试一试{ //代码行 服务。服务方法(reqObj); //代码行 }捕获(例外情况除外){ S.O.P(“在控制器的调用服务方法中捕获 类别);; } } 公共接口MyService{ SomeResponse服务方法(SomeRequest reqObj); } @服务 公共类MyServiceImpl实现了MyService{ @自动连线 私人雇员道恩帕道; @自动连线 私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人; @自动连线 私有MetadataDAO-metaDAO; @事务性(value=“事务管理器\u Bean\u名称”) 公共SomeResponse服务方法(SomeRequest reqObj){ List personList=..;//从中获取人员列表 //Rekobj List Employist=……;//获取员工列表 //来自Rekobj SomeHelper SomeHelper=新的SomeHelper(empDAO、personDAO、, metaDAO); 试一试{ 操作人员(…); 员工(…); doOperationMetadata(…); }捕获(例外情况除外){ S.O.P(“在Impl类的serviceMethod中捕获”); } } @事务性(value=“事务管理器\u Bean\u名称”) 公共无效操作人员(列表人员列表, 列出个人、某人助手(某人助手){ personList.stream().forEach(person->{ 试一试{ someHelper.PerformTaskPerson(person,personErrors); }捕获(例外情况除外){ S.O.P.(“被发现在Impl的操作人员内 类别);; add(例如getMessage()); } } } @事务性(value=“事务管理器\u Bean\u名称”) 公共无效操作员工(列表员工、, 列出错误,SomeHelper SomeHelper){ empList.stream().forEach(emp->{ 试一试{ 一些助手。执行任务的员工(emp、empErrors); }捕获(例外情况除外){ S.O.P.(“被发现在Impl的员工内部 类别);; add(例如getMessage()); } } } @事务性(value=“事务管理器\u Bean\u名称”) public void doOperationMetadata(SomeOtherData元数据, 列表元数据列表,SomeHelper SomeHelper){ empList.stream().forEach(emp->{ 试一试{ PerformTaskMetadata(元数据, 元数据列表); }捕获(例外情况除外){ S.O.P(“被发现在Impl的DoOperationMetadata中 类别);; add(例如getMessage()); } } } } 公共类助手{ 私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人; 私人雇员道恩帕道; 私有MetadataDAO-metaDAO; 一些助手(PersonDAO PersonDAO、EmployeeDAO empDAO、MetadataDAO metaDAO){ this.personDAO=personDAO; this.empDAO=empDAO; this.metaDAO=metaDAO; } @事务性(value=“事务管理器\u Bean\u名称”, 传播=传播。需要(新) 公共作废绩效任务员工(员工emp,列表 皇帝){ EmpEntity EmpEntity=empDAO.getEmployee(emp); emperity.setName(…); //更新其他字段 } @事务性(value=“事务管理器\u Bean\u名称”, 传播=传播。需要(新) public void performtaskoneemployee(个人,列表 (人事代表){ PersonEntity perEntity=personDAO.getPerson(person); perEntity.setName(…); //更新其他字段 } @事务性(value=“事务管理器\u Bean\u名称”, 传播=传播。需要(新) public void performTaskOnMetaData(SomeOtherData元数据, 列表元数据列表){ 元实体MetaEntity=metaDAO.getOther(元数据); 集合名(…); //更新其他字段 } },transactions,propagation,Transactions,Propagation,当somehelper类中的任何方法(将传播行为设置为'requires_new'的事务块)发生异常时,为什么调用方类中没有处理它(具有默认传播行为的事务块)?而不是看到消息“捕获到Impl类的DoOperationMetadata中”,我收到消息“Catch in callServiceMethod of Controller class”。如果问题是如果底层方法中出现异常,是否可以在外部方法中发生事务回滚,则答案是否定的,因为每个方法都将被视为独立的事务 参考-并且我想问的是,当从另一个方法
参考-并且我想问的是,当从另一个方法(使用默认传播的方法1)调用的方法(使用requires\u new传播的方法2)抛出异常时,该异常(这意味着回滚)是否可以在调用方方法(方法1)处处理
@Controller
public class MyControllerClass{
@Autowired
private MyService service;
public SomeResponse callServiceMethod(SomeRequest reqObj){
try{
//lines of codes
service.serviceMethod(reqObj);
//lines of codes
} catch(Exception ex){
S.O.P("caught inside callServiceMethod of Controller
class");
}
}
public interface MyService{
SomeResponse serviceMethod(SomeRequest reqObj);
}
@service
public class MyServiceImpl implements MyService{
@Autowired
private EmployeeDAO empDAO;
@Autowired
private PersonDAO personDAO;
@Autowired
private MetadataDAO metaDAO;
@Transactional(value="transaction_manager_Bean_Name")
public SomeResponse serviceMethod(SomeRequest reqObj){
List<Person> personList = ....;//fetch list of person from
//reqObj
List<Employee> empList = ......;//fetch list of Employee
//from reqObj
SomeHelper someHelper = new SomeHelper(empDAO, personDAO,
metaDAO);
try{
doOperationOnPerson(...);
doOperationOnEmployee(...);
doOperationOnMetadata(...);
} catch(Exception ex){
S.O.P("caught inside serviceMethod of Impl class");
}
}
@Transactional(value="transaction_manager_Bean_Name")
public void doOperationOnPerson(List<Person> personList,
List<String> personErrors, SomeHelper someHelper){
personList.stream().forEach(person ->{
try{
someHelper.performTaskOnPerson(person, personErrors);
} catch(Exception ex){
S.O.P("caught inside doOperationOnPerson of Impl
class");
personErrors.add(ex.getMessage());
}
}
}
@Transactional(value="transaction_manager_Bean_Name")
public void doOperationOnEmployee(List<Employee> empList,
List<String> empErrors, SomeHelper someHelper){
empList.stream().forEach(emp ->{
try{
someHelper.performTaskOnEmployee(emp, empErrors);
} catch(Exception ex){
S.O.P("caught inside doOperationOnEmployee of Impl
class");
personErrors.add(ex.getMessage());
}
}
}
@Transactional(value="transaction_manager_Bean_Name")
public void doOperationOnMetadata(SomeOtherData metadata,
List<String> metaDataList, SomeHelper someHelper){
empList.stream().forEach(emp ->{
try{
someHelper.performTaskOnMetaData(metadata,
metaDataList);
} catch(Exception ex){
S.O.P("caught inside doOperationOnMetadata of Impl
class");
personErrors.add(ex.getMessage());
}
}
}
}
public class SomeHelper{
private PersonDAO personDAO;
private EmployeeDAO empDAO;
private MetadataDAO metaDAO;
SomeHelper(PersonDAO personDAO, EmployeeDAO empDAO, MetadataDAO
metaDAO){
this.personDAO = personDAO;
this.empDAO = empDAO;
this.metaDAO = metaDAO;
}
@Transactional(value="transaction_manager_Bean_Name",
propagation=Propagation.REQUIRES_NEW)
public void performTaskOnEmployee(Employee emp, List<String>
empErrors){
EmpEntity empEntity = empDAO.getEmployee(emp);
empEntity.setName(...);
//update other fields
}
@Transactional(value="transaction_manager_Bean_Name",
propagation=Propagation.REQUIRES_NEW)
public void performTaskOnEmployee(Person person, List<String>
personErrors){
PersonEntity perEntity = personDAO.getPerson(person);
perEntity.setName(...);
//update other fields
}
@Transactional(value="transaction_manager_Bean_Name",
propagation=Propagation.REQUIRES_NEW)
public void performTaskOnMetaData(SomeOtherData metadata,
List<String> metaDataList){
MetaEntity metaEntity = metaDAO.getOther(metadata);
metaEntity.setName(...);
//update other fields
}
}