我正在试着写一个悲观写的JUnit测试。我的想法是在一个事务中执行此方法,同时在另一个事务中再次运行它,并尝试修改从第一个事务中的方法返回的元素。我预计会出现异常/超时,因为第一个调用应该锁定该行。我做过类似于this的事情,但是第二个事务(testNewTrans方法)毫不犹豫地修改了元素。是不是我哪里做错了?
public interface RequestRepository extends CrudRepository<Object, Long> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("select ... ")
List<Object> findABC(Pageable pageable);
}在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");
}
}发布于 2017-03-01 02:44:30
直接从testLock()调用testNewTrans()意味着它不能被spring拦截,因此调用testNewTrans()会忽略任何@Transactional (和其他)注释。
如果你已经自动绑定了一个包含testNewTrans()的服务并调用它,你会看到不同的效果。
https://stackoverflow.com/questions/42516378
复制相似问题