首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring Data上的LockModeType.PESSIMISTIC_WRITE

Spring Data上的LockModeType.PESSIMISTIC_WRITE
EN

Stack Overflow用户
提问于 2017-03-01 02:39:15
回答 1查看 783关注 0票数 0

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

代码语言:javascript
复制
public interface RequestRepository extends CrudRepository<Object, Long> {
    @Lock(LockModeType.PESSIMISTIC_WRITE)
    @Query("select ... ")
    List<Object> findABC(Pageable pageable);
}

在junit中

代码语言:javascript
复制
@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
}

在新班级中

代码语言:javascript
复制
@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");
}
}
EN

回答 1

Stack Overflow用户

发布于 2017-03-01 02:44:30

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

如果你已经自动绑定了一个包含testNewTrans()的服务并调用它,你会看到不同的效果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42516378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档