问题描述
我有以下情况:
我有一个用@Transactional(readOnly = true)
注释的方法(父方法),在这里我提取了一些实体。此方法将多次(100+)调用另一种方法(子方法),该方法需要创建一个人员实体并为此需要获取的实体。此子方法将获取的实体作为参数,并用@Transactional(propagation = Propagation.REQUIRES_NEW)
注释,因为我不希望一个人的创建失败会阻止另一个人的创建。
我想知道的是以下内容:
- 这是不好还是好的做法?
- 只读交易有什么影响?这项交易会在很长一段时间内(+-5分钟)保持活动状态,最佳做法是使交易尽可能小。
解决方法
如果所有只读方法所做的只是获取,然后将对象传递给另一种方法,则如果更新许多IMO对象,则最好只使用单个写入事务或批量写入事务。您能解释为什么子方法失败吗?
您正在做的是做“批处理工作”的一种方法。因为您要为每个项目创建一个事务,所以实际上使用的是所谓的“块大小”(chunk size)为1。如果要处理的项目很多,而且处理起来很简单,那么这可能会对数据库造成很大的压力。通常,最好设计可变的块大小并调整块大小,直到满足您的需求为止。
根据您的生态系统,您可以使用以下解决方案之一: