在我的springBoot
项目中,我正在使用hibernate在我的oracle数据库上获取lock
。
在我的交易中,我执行以下代码:
Query q = em.createQuery("SELECT m FROM myTablem WHERE foo= :cat");
q.setParameter("cat", myValue);
q.setMaxResults(1);
//use pessimistic lock
//With Oracle, the select is a 'select for update' request
q.setLockMode(LockModeType.PESSIMISTIC_WRITE);
//set hibernate timeout to 0
//With Oracle, the 'select for update' is transformed in 'select for update nowait'
q.setHint("javax.persistence.lock.timeout", 0);
List<Msisdn> msisdns = q.getResultList();
我想在我的数据库上执行"select for update"
。
但是使用这段代码,hibernate会执行两个请求:
Hibernate :select * from(select my from myTablem m cross join categorie_critere categoriec1_ where m.foo = ...)其中rownum&lt; =?
Hibernate :从m中选择ce_code_abpq,其中idpk1 =?和idpk2 =?和idpk3 =?用于更新nowait
在第一个请求中,hibernate执行select
请求。在第二个请求中,休眠在所选元素上调用"select for update"
。
是否可以选择仅在一个请求中执行"select for update"
?
此致 塞德里克
答案 0 :(得分:1)
禁用后续锁定:
Oracle12cDialect
,或将HINT_FOLLOW_ON_LOCKING
查询提示设置为false
有关详细信息,请参阅here。