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);
}
.
.