Re[4]: Hibernate + пропуск залоченных строк
От: and_hom  
Дата: 28.01.08 15:31
Оценка:
Здравствуйте, deepsky, Вы писали:

D>Здравствуйте, and_hom, Вы писали:


D>>>Хибернейт может использовать только средства целевой базы для подобных вещей. Попробуй использовать "... for update nowait" в нативном запросе к ораклу, с хибернейтом не пробовал, но в PRO*C "форапдейт ноу вейт" работает.


_>>Хибернейт прекрасно умеет nowait на Oracle, MS SQL, на других не пробовал (query.setLockMode(...))

_>>Но nowait — это значит "кидать эксепшн сразу же, если наткнулись на строчку, не удовлетворяющую условию". Тогда придётся тащить список id-шников и в цикле по ним

D>nowait означает пропускать строки залоченные другими транзакциями, т.е. если у нас есть 3 строки две из которых залочены другими транзакциями, то результирующий запрос вернет одну строку, при этом наложив на нее эксклюзивную блокировку на запись (TX). Последующий запрос не вернет ни одной строки, если они все еще залочены транзакциями.

D>Т.е. оракл никаких исключений не бросает,
У меня в стектрейсе присутствуют ошибки ORA-xxxxx

D> если они у вас возникают, то скорее всего вследствие не правильного конфигурирования хибернейта, поэтому я и предложил использовать нативный запрос к ораклу, дабы избежать подобных коллизий.


Откройте два окна SQL Plus
set autocommit false

create table A(B integer);
insert into A values(1);
insert into A values(2);
insert into A values(3);
commit;

в 1-м окне
select * from A where B=1 for update

во втором
select * from A for update nowait

Второе окно выкинет оракловую ошибку — специально проверял.
Причём, ту же самую, что и в стектрейсе
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.