我有一个用@Transactional(propagation = Propagation.REQUIRES_NEW)
注释的方法。从带有@Transactional(propagation = Propagation.NOT_SUPPORTED)
的方法中间接调用该方法,该方法应中断其所调用方法的每个现有事务。中断事务工作正常。我的问题是,Propagation.REQUIRES_NEW
并没有创建我需要的新交易。
但是,我能够执行手动交易管理,在这种情况下,整个结构可以按预期工作。但是我真的很想避免手动交易管理。
所以我的问题是,如何根据需要在Propagation.REQUIRES_NEW
中使用Propagation.NOT_SUPPORTED
创建新交易?
根据要求输入代码:
测试类的初始调用:
service.loadData(false);
服务是如下界面:
@Transactional
public interface DataService {
@Transactional(propagation = Propagation.NOT_SUPPORTED)
void loadData(boolean singleDayOnly);
void someOtherMethodWithDefaultTransaction();
}
服务实现调用控制器:
@Override
public void loadData(boolean singleDayOnly) {
controller.loadData(singleDayOnly);
}
Controller
也是一个接口,但没有任何@Transactional
。
Controller
实现:
@Override
public void loadData(boolean singleDayOnly) {
List<Data> data = getAllForRequest();
for (Data entry : data) {
someMethodWithTransaction(entry);
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
private List<Data> getAllForRequest() {
//dao.getHibSession().beginTransaction();
List<Data> l = securityDailyDataDao.getAllForRequest();
//dao.getHibSession().getTransaction().commit();
return l;
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void someMethodWithTransaction(SecurityDailyData entry) {
//securityDailyDataDao.getHibSession().beginTransaction();
DTO dto = ..getDTO();
entry.setCode(dto.getID());
securityDailyDataDao.getHibSession().merge(entry);
//securityDailyDataDao.getHibSession().getTransaction().commit();
}
这就是我想要的样子。但是没有创建任何交易,这就是我必须手动创建交易的原因