Java 休眠锁定模式

Java 休眠锁定模式,java,mysql,hibernate,jpa,locking,Java,Mysql,Hibernate,Jpa,Locking,你能给我解释一下为什么测试失败,这意味着锁不工作吗 @Test @Transactional public void run() throws InterruptedException { int id = initDB(); Myobj myobj= dao.get(id, LockMode.PESSIMISTIC_READ); Thread thread = new Thread(() -> del

你能给我解释一下为什么测试失败,这意味着锁不工作吗

    @Test
    @Transactional
    public void run() throws InterruptedException {
        int id = initDB();
        Myobj myobj= dao.get(id, LockMode.PESSIMISTIC_READ);
       
        Thread thread = new Thread(() -> delete(id));
        thread.start();
        thread.join();

        Assert.assertNotNull(dao.get(id, LockMode.NONE));
   }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void delete(long id){
           Myobj myobj = new Myobj(id);
           dao.delete(myobj);
    }

我正在使用Mysql5和hibernate5.4.0

我可以从hibernate日志中看到,他在sql请求中包含了锁:


在共享模式下锁定

对于手动创建的线程,这确实是任何人的猜测,但我首先要检查您是否在
获取
删除
中获得了不同的
会话(因为如果没有,共享锁可能只是被提升为独占锁),您想如何知道它“工作"? 你的线程可能会抛出异常,而你在任何地方都看不到。另外,我不知道你是否可以像那样开始一个线程。我不认为事务在这样的线程中工作。@crizz是不同的Sessions@ChristianBeikov悲观读取应该阻止其他事务修改/删除实体,直到当前事务完成。我的测试失败=>另一个线程在删除实体时没有遇到任何问题,尽管存在锁。连接呢?
((SessionImpl)session).connection()是否在
get
delete中返回不同的连接?
@Repository
@Transactional(readOnly = true)
public class DAO{

    @Autowired
    private SessionFactory sessionFactory;

    @Transactional
    public Myobj get(long id, LockMode mode){
        return sessionFactory.getCurrentSession().get(Myobj.class,id,mode);

    }

    @Transactional
    public void delete(Myobj myobj){
        sessionFactory.getCurrentSession().delete(Myobj.class.getName(),myobj);
    }
.
.