当前位置: 首页 > 知识库问答 >
问题:

使用悲观锁在进程期间启动JPA事务提交

文自怡
2023-03-14

我需要使用悲观锁执行批处理操作,以便在此操作期间没有其他人可以读取或写入此行。但是我想在每批之后增加页码,以便如果事务失败或实例死亡,我将从最后一页继续。但是使用下面的代码,它不会更新页面,直到所有批处理完成,所以当重新启动作业时,它会从页面=0开始处理。

@Transactional
public void process(long id) {
    Entity entity = repo.findById(id);
    processBatch(entity);
}

void processBatch(Entity entity) {
    int totalPages = otherMicroService.getTotalPages(id);
    int lastPage = entity.getPage();
    for(int page=lastPage; i<totalPages; i++) {
        doOperation();
        entity.setPage(page);
        repo.save(entity);
    }
}


@Lock(LockModeType.PESSIMISTIC_WRITE)
Optional<Entity> findById(int id);

有没有办法在每批启用悲观_写后更新页面?

提前谢谢。

共有1个答案

贲绪
2023-03-14

我将添加@Transacti的(传播=Propagation.REQUIRES_NEW)进程批处理,因此数据将在每次迭代时提交(btw,保存保存将在这种情况下工作相同)。

请注意,添加此注释后,需要将< code>processBatch方法移动到单独的bean中(或者应该进行bean的自注入),以使Spring AOP正常工作。

 类似资料:
  • 我在Spring Boot 2.3中使用Drools,并且实现了持久感知的会话,其中MySQL用于存储会话。我已经成功地将Spring Boot的默认< code > entitymanager factory 与Drools集成在一起,但是我的问题是事务。默认情况下,Drools在事务期间使用乐观锁,但是它也允许我们使用悲观锁,这正是我想要的。现在,在触发规则时,Drools使用以下查询持久化/

  • 我正在使用Spring Boot、JPA、Oracle 12C和下面的类型化查询来选择要处理的“新”项目。一旦我选择了“新”项目,我就会更新其状态,使其不再符合选择条件,但我看到一个并发问题,相同的项目被选中。 我在这里读到,我需要设置一个'LockModeType.PESSIMISTIC_WRITE'的查询,以防止其他线程选择相同的行,但它似乎不起作用。 我是否遗漏了下面的内容,或者我是否需要另

  • 我在一个游戏服务器上使用Hibernate for ORM,刚刚从每个工作单元的会话/事务切换到每个请求的会话/事务。 由于多个事务可能相互冲突,因此我使用悲观锁定。问题是我经常遇到僵局。现在我的问题是,是否可以在锁定特定实体实例的事务中显式定义范围,或者在指定锁定模式后是否锁定实例直到我提交事务? 如果后者成立,如果我不能任意调度锁定数据库中资源的方法的方法调用,我如何避免每个请求环境中的会话事

  • Hibernate是我的JPA实现。

  • 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。 乐观锁与悲观锁的具体区别: http://www.cnblogs.com/Bob-FD/p/3352216.html

  • PESSIMISTIC_READ-实体在数据库上被锁定,防止任何其他事务获得PESSIMISTIC_WRITE锁。 PESSIMISTIC_WRITE-实体在数据库上被锁定,防止任何其他事务获得PESSIMISTIC_READ或PESSIMISTIC_WRITE锁。 如果我理解对的话,那么如果我们有三个用户(A,B,C),用户A获得读锁,那么用户B也可以获得读锁,但是用户C不能获得写锁,直到用户A