私のサービスクラス。
@Service
@Transactional(value = "transactionManager", readOnly = true, propagation = Propagation.REQUIRED)
public class DeviceServiceImpl{
@Transactional(readOnly = false)
public void blockAllDevices(){
createSmsDeviceBlock();
}
public void createSmsDeviceBlock(){
addToLogTables();
smsService.sendSms();
}
@Transactional(readOnly = false,propagation = Propagation.REQUIRES_NEW)
public void addToLogTables(){
try {
//save object with DAO methods...
} catch (Exception e) {
throw new ServiceException(ServiceException.PROCESSING_FAILED, e.getMessage(), e);
}
}
}
私の controller から、サービスメソッド blockAllDevices() が呼び出されます。addToLogTables() メソッドは Propergation.REQUIRED_NEW としてマークされていますが、問題は addToLogTables() メソッドで新しいトランザクションが作成されず、既存のトランザクションが使用されていることです。
私がやりたいことは、 addToLogTables() メソッドのトランザクションは、smsService.sendSms() メソッドを実行する前にコミットする必要があるということです。
ここでの私の問題は、メソッド addToLogTables() メソッドでトランザクションがコミットに失敗した場合、smsService.sendSms() メソッドを実行すべきではありません。