我正在尝试编写一个关于悲观写入的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");
}
}
直接从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()之后其他实例无法更新吗?还是别的什么?还是我错过了什么?