Seguinte estou com problemas de concorrencia com Hibernate!
Recupero um objeto, faco os devidos testes para verificação se posso editar (se ainda tenho produtos no estoque ;)), para o clock desse processo, e vem uma segunda requisição e faz a mesma verificação (produtos no estoque), em seguida as duas persistem no banco, deixando meu saldo negativo
Preciso de uma dica de uma “best pratice” para agir nesses casos, não entendi direito o funcionamento do LockMode e para ser sincero nein sei se tenho que usar isso mesmo.
Tipo, não queria pirar em Monitor ou semafaro threads e tal, o Hibernate deve ter suporte a esse tipo de situação certo?
vlws
T+
Sirleno (Belojr)
Duas suspeitas:
- tenta mudar o transaction isolation do bd para serializable;
- Tomcat não controla transação… talvez esteja faltando isso…
t+
Ué,
mas isso não deveria ser configurado no proprio Hibernate?
Pois as transactions que são usadas são as do Hibernate.
t+
Sirleno (Belojr)
Amigo,
Dá uma olhada neste link:
http://www.hibernate.org/hib_docs/reference/en/html/transactions.html
Fala de transações e concorrencia… fala do LockMode também… dá uma lida…
Ainda sim não consegui resolver o problema.
Bom, ou eu posso deixar para o banco fazer isso por mim, blza… pode ser essa alternativa.
Qdo faco um load do obj Estoque, com sua quantidade e ao mesmo tempo vem uma segunda requisição e faz um load do mesmo objeto.
A primeira requisição verifica q tem a quantidade do produto desejado ali, o segundo tb verifica a quantidade e os dois fazem um update do registro, o segundo é o q vale! Como faco para matar esse tipo de situção com caracteristicas do Hibernate ou do banco?
Também tentei fazer de acordo com esse código:
[code]
try {
tx = s.beginTransaction();
bar.setFooTable( new HashMap() );
Iterator iter = fooList.iterator();
while ( iter.hasNext() ) {
Foo foo = (Foo) iter.next();
s.lock(foo, LockMode.READ); //check that foo isn't stale
bar.getFooTable().put( foo.getName(), foo );
}
tx.commit();
}
catch (Exception e) {
if (tx!=null) tx.rollback();
throw e;
}
finally {
s.close();
}[/code]
Mas cometi algum equivico, pois ele continuou fazendo tudo da mesma maneira.
Mais alguma dica cara?
Chegou a mudar o transaction isolation?
Seguinte, dirty read pode acontecer com o read uncommited e read commited… serializable é o modo mais restritivo… se por acaso esse for o problema, certo que resolverá…
No caso, já que você está armazenando apenas um objeto, não teria porque ter grandes problemas…
Mas eu faco isso direto no banco ou tem como solicitar para o Hibernate fazer isso por mim?
É que se eu ficar mexendo nesse tipo de coisa no banco de dados eu perco a “independencia”.
vlw a ajuda em cara!
Seguinte…
Lá no teu hibernate.properties seta a propriedade hibernate.connection.isolation com o respectivo valor para serialiazable.
Eu não sei o valor de cabeça… dá uma olhada na constante TRANSACTION_SERIALIZABLE na interface Connection… usa esse valor…