假设我有一个呼叫者将工作分配给多个异步任务:
<input type="text" class="form-control" id="dateOfBirth" name="dateOfBirth" bsDatePicker #dp="bsDatepicker" [(ngModel)]="dateOfBirth" placeholder="DateOfBirth">
// call the dp.show() method either by attaching the click event on the input or add a button alongside it
如果我们有2个相同的实体:
使用同步方法,将创建第一个,然后从现有实体中检索第二个;
如果使用异步,则第二个实体可能会通过public class Caller{
public boolean run() {
for (int i = 0: i< 100; i++) {
worker.asyncFindOrCreate(entites[i]);
}
return true;
}
public class Worker{
@Autowired
Dao dao;
@Async
public E asyncFindOrCreate(User entity) {
return dao.findByName(entity.getName).elseGet(() -> dao.save(entity));
}
}
并转到findByName
,因为第一个实体尚未保存,这导致第二个实体的save
抛出唯一标识符错误。
是否可以添加一些容错机制来具有某些功能,例如重试和skipAfterRetry,尤其是对于数据库操作。
答案 0 :(得分:0)
在这种特殊情况下,您应该将数组转换为地图。使用name属性作为键,这样就不会有重复的条目。
但是,如果该方法也可以被多个线程调用(例如,它位于Web服务器中),或者有多个实例在运行,则它仍然不是故障安全的。
一般来说,您应该让数据库检查唯一性。没有最安全/最简单的方法。将save方法放入try-catch块中,然后检查/处理唯一标识符异常。