实现 Java 多线程以防止事务回滚的最佳方法
Best way to impletent Java multithreading to prevent transaction rollback
我有一个包含 4 个 DTO 的列表。我正在对列表中的每个 DTO 执行一些处理。如果假设对于一个 DTO,出现任何异常,则所有事务都将回滚(即使其他 3 个 DTO 的过程成功)。
我的代码如下所示:
@Transactional
public void processEvent(List<MyObject> myList){
myList.forEach(dto -> process(dto));
}
public void process(MyObject dto){
//some code which calls another class marked as @Transactional
// and save the data processed to database
}
我想在单独的线程上为每个 DTO 执行这些过程,这样在一个线程中遇到的异常不会回滚所有 DTO 的事务。
另外有没有办法在不同的线程上一个一个地处理这些DTO,从而保持数据的一致性?
只需将事务移动到使用 dto 调用的方法,另外我不确定是否需要 dto 的事务。这看起来像一个不应该有任何事务注释的控制器。在服务中,一旦您将 dto 更改为实体并准备好保存它,您就可以放置注释。此外,如果您只是简单地调用存储库的保存方法,则不需要进行事务处理,因为保存方法在存储库中有注释。
public void processEvent(List<MyObject> myList){
myList.forEach(dto -> process(dto));
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void process(MyObject dto){
//some code which calls another class marked as @Transactional
// and save the data processed to database
}
最后一个建议不要将@Transactional 放在类 上,除非它们将readOnly 参数设置为true。然后你可以把@Transactional 放在执行任何CRUD 操作的方法上。
我有一个包含 4 个 DTO 的列表。我正在对列表中的每个 DTO 执行一些处理。如果假设对于一个 DTO,出现任何异常,则所有事务都将回滚(即使其他 3 个 DTO 的过程成功)。
我的代码如下所示:
@Transactional
public void processEvent(List<MyObject> myList){
myList.forEach(dto -> process(dto));
}
public void process(MyObject dto){
//some code which calls another class marked as @Transactional
// and save the data processed to database
}
我想在单独的线程上为每个 DTO 执行这些过程,这样在一个线程中遇到的异常不会回滚所有 DTO 的事务。 另外有没有办法在不同的线程上一个一个地处理这些DTO,从而保持数据的一致性?
只需将事务移动到使用 dto 调用的方法,另外我不确定是否需要 dto 的事务。这看起来像一个不应该有任何事务注释的控制器。在服务中,一旦您将 dto 更改为实体并准备好保存它,您就可以放置注释。此外,如果您只是简单地调用存储库的保存方法,则不需要进行事务处理,因为保存方法在存储库中有注释。
public void processEvent(List<MyObject> myList){
myList.forEach(dto -> process(dto));
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void process(MyObject dto){
//some code which calls another class marked as @Transactional
// and save the data processed to database
}
最后一个建议不要将@Transactional 放在类 上,除非它们将readOnly 参数设置为true。然后你可以把@Transactional 放在执行任何CRUD 操作的方法上。