【发布时间】:2015-02-24 15:45:50
【问题描述】:
我的服务器在带有 Spring-boot 的 RestFul 架构上运行,使用 spring-mvc、hibernate 和 oauth2。没有 HTTP 会话,无状态。 我需要上传一个文件并在服务器端解析这个文件以提取数据并将它们存储在我的数据库中。 这个处理可能需要一段时间,所以我想跟踪这个处理的进度,在我的 webapp 中显示一个进度条。 文件的解析被定义为事务弹簧服务。通过这项服务,我更新了一些计数器,并且我想将这些计数器存储在我的数据库中。然后我有一个休息服务,通过轮询机制定期从我的 web 应用程序中获取这些计数器。 我的问题:由于我的解析处理是事务性服务,所有内容仅在处理结束时提交到数据库中。所以我的计数器也在处理结束时提交。所以我检索我的计数器的 REST 服务是无用的,因为它总是返回空...... --> 如何在为整个服务维护事务服务的同时将计数器提交到我的数据库?我认为它会处理春季事务传播,我试图用 Propagation.REQUIRES_NEW 定义一些方法来更新我的计数器但没办法,我的计数器只在服务执行结束时持久化...... 也许我的方法不是正确的,请随时建议我替代方法!
谢谢
这是我的代码。 所有方法都在同一个类中声明,并用@Service 注释
@Service
public class AuditService {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void createNewResult(Long transactionId, Long auditTotal) {
AuditLaboImportResult auditResult = new AuditLaboImportResult();
auditResult.setTransactionId(transactionId);
auditResult.setAuditsTotal(auditTotal);
auditResult.setAuditsTraites(0L);
auditLaboImportResultRepository.save(auditResult);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateUploadResult(Long transactionId, Long auditTraites) {
AuditLaboImportResult auditResult = auditLaboImportResultRepository.findByTransactionId(transactionId);
auditResult.setAuditsTraites(auditTraites);
auditLaboImportResultRepository.save(auditResult);
}
@Transactional
public List<Audit> uploadFiles(Long transactionId, MultipartFile fileEHT, MultipartFile fileEHC) {
....
createNewResult(transactionId, new Long(audits.size()));
....
for (Audit audit : audits) {
....
updateUploadResult(transactionId, auditsTraites);
....
}
}
}
【问题讨论】:
-
在 Propagation.REQUIRES_NEW 事务传播中更新计数器应该可以工作。你能发布你的完整代码吗?我们可以进一步排除故障
标签: spring spring-transactions