Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Spring不允许读操作上的独占锁定?_Java_Spring_Spring Mvc_Spring Data_Spring Data Jpa - Fatal编程技术网

Java 为什么Spring不允许读操作上的独占锁定?

Java 为什么Spring不允许读操作上的独占锁定?,java,spring,spring-mvc,spring-data,spring-data-jpa,Java,Spring,Spring Mvc,Spring Data,Spring Data Jpa,有人知道为什么Spring不允许在读操作上放置@Lock(LockModeType.悲观写) @Lock(LockModeType.PESSIMISTIC_WRITE) Human findByNameAndStreet(String name, String street); 还有为什么EntityManager本身允许您对读取操作设置独占锁 entityManager.createQuery("select o from Human o where o.name= :name and o.

有人知道为什么Spring不允许在读操作上放置@Lock(LockModeType.悲观写)

@Lock(LockModeType.PESSIMISTIC_WRITE)
Human findByNameAndStreet(String name, String street);
还有为什么EntityManager本身允许您对读取操作设置独占锁

entityManager.createQuery("select o from Human o where o.name= :name and o.street= :street", Human.class)
            .setLockMode(LockModeType.PESSIMISTIC_WRITE).setParameter("name", name).setParameter("street", street).getSingleResult();

总之,在Spring中的同一个select查询上,我不能设置写锁,而使用EntityManager我可以。我真的不知道为什么Spring不允许您做同样的事情。

要使用锁定,您必须有适当的事务边界。如果您没有它们,那么锁的唯一作用就是
findByNameAndStreet


但是,如果从本身是事务性的服务方法调用此方法,则锁将跨越整个事务性服务方法

悲观写锁会产生什么影响?对读取行进行独占锁。代码流是特定的,所以第一个读取事务应该锁定该行,下一个事务应该等到第一个事务完成。我能够用EntityManager实现这一点,但我想知道为什么Spring不允许您对select查询设置排他锁。我猜是因为您的事务边界定义错误(或未定义)。@ALXBX我认为您误用数据库锁作为同步和协调应用程序流的一种方式。@M.Denium您是对的。你能评论一下吗?这样我就可以把它标为正确答案了。谢谢正是我需要的答案。谢谢!