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

锁定模式类型。Spring数据上的悲观_写

松钊
2023-03-14

我正在尝试编写一个关于悲观写入的JUnit测试。我的想法是在一个事务中执行这个方法,同时在另一个事务中再次运行它,并尝试修改从第一个事务中的方法返回的元素。我预计会出现异常/超时,因为第一次调用应该锁定该行。我已经做了类似的事情,但是第二个事务(testNewTrans方法)毫不犹豫地修改了元素。有什么地方我做错了吗?

public interface RequestRepository extends CrudRepository<Object, Long> {
    @Lock(LockModeType.PESSIMISTIC_WRITE)
    @Query("select ... ")
    List<Object> findABC(Pageable pageable);
}

in jUnit

@RunWith(SpringRunner.class)
@DataJpaTest
@TransactionConfiguration(defaultRollback = true)
public class RepositoryTest {

@Configuration
@ComponentScan("test.package")
@ContextConfiguration
public static class SpringConfig {

}

@Test
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void testLock() throws InterruptedException {
    List<Object> requests1 = requestRepository.findABC(new PageRequest(0, 2));
    test22.testNewTrans(); // return empty list
}

在新班级

@Component
public class Test22 {

private final RequestRepository requestRepository;

public Test22(RequestRepository requestRepository) {
    this.requestRepository = requestRepository;
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
private void testNewTrans() {
    List<Object> requests2 = requestRepository.findABC(new PageRequest(0, 2));
    Object aa = requests2.get(0);
    System.out.println("=============>" + aa);
    aa.setSomething("abc");
}
}

共有1个答案

曾实
2023-03-14

直接从testLock()调用testNewTrans()意味着它不能被Spring拦截,因此调用testNewTrans()会忽略任何@Transactional(和其他)注释。

如果您自动连接了一个包含testNewTrans()的服务并调用了它,您将看到不同的效果。

 类似资料:
  • 我试图理解Hibernate中的悲观锁定机制(通过MySQL DB)。 我尝试运行以下示例: 但它并没有给我一个错误,而是执行得很好。是不是我误解了什么概念。这种行为正常吗? 我能够完美地测试乐观锁定,那么对于悲观锁定,是对概念有一些误解,还是我的代码缺少了一些东西。

  • 问题内容: 我在java下有spring项目,使用hibernate查询,我喜欢使用悲观锁定。 在Spring + Hibernate中如何进行悲观锁定? 编辑: 问题: 我想在一个方法中使用悲观锁定,并且我将此方法称为从不同的方法。当我从第一个方法调用它时,悲观的工作效果很好,但是当我从第二个方法调用它时,它给出了(无法提交事务) 例外: 问题答案: http://www.amicabile.c

  • 我遵循grails文档,它说要做悲观锁定,我可以这样做: 所以这会锁定计划实例,直到保存完成。现在在我的例子中,我想一次锁定多个计划,如下所示: 我在默认情况下是事务性的 grails 服务中执行此操作,但上述行没有按预期工作。它不会锁定所有行,并在执行并发事务时引发。 如何在阅读时锁定多行? 有关更多信息,请参见相关问题:grails中的并发事务导致数据库陈旧状态异常

  • 我没有成功地将Spring数据发送给postgres a以进行NoWait更新。 我已经在存储库中尝试过了: 配置(代码段) 我甚至将EntityManager注入到服务中,结果返回0: info(em.getproperties().get(“javax.persistence.lock.timeout”)); 但是上面只给了我“用于更新”,没有设置NOWAIT部分。我设置的事情是正确的(从另一

  • 我在用 Spring Boot 1.4.2 Spring Data JPA 1.10.5 PostgreSQL 9.5数据库 不幸的是,这不会刷新实体管理器缓存中我的实体的上一个实例。我有两个同时更新注册状态的请求 第二个等待第一个事务的事务提交 第二个不考虑第一个所做的更改。 从而破坏行为。 下面是请求的示例代码:

  • 我上面代码的日志是: 数据库也会更新。为什么lock()不工作?不是在lock()之后其他实例无法更新吗?还是别的什么?还是我错过了什么?