Spring 负责所有底层事务管理细节,并为不同的事务 API 提供一致的编程模型,但有多少人真正了解它在多线程环境中的行为方式?是否可以在多个线程中打开事务并写入数据?
让我们退一步思考一下EntityManager。
EntityManager的工作是与一个会话或被它管理的对象的缓存一起进行的。这意味着它有一个状态,而在几个线程之间共享状态会导致竞争条件;
所以,第一条规则是每个线程使用一个EntityManager。
事实上,Spring负责保持每个线程的事务性上下文。
假设我们想并行处理一个对象列表并将其存储在数据库中。我们想把这些对象分成专门的小块,并把每个小块传递给一个单独线程中的处理方法。然后,每个线程中处理的结果应该被收集起来并呈现给用户。
我将从定义一个负责处理的服务接口开始:
/**
- Service interface defining the contract for object identifiers processing
/public interface ProcessingService { /*
* Processes the list of objects identified by id and returns a an identifiers
* list of the successfully processed objects
*
* @param objectIds List of object identifiers