GARANTIR DESCONTO

Fórum Update com JPA utilizando valor do banco de dados #485317

12/07/2014

0

Olá pessoal, eu uso o JPA em meu projeto, e consigo fazer praticamente tudo, muitas coisitas com ajuda aqui do fórum e dos cursos devmedia.
Porem estou com uma duvida que esta me levando a usar SQL nativo.

Seguinte, gostaria de fazer um Update para atualizar o saldo de estoque de um produto, sendo assim no SQL puro eu faria assim:
//Existe um sinal de mais entre o saldoestoque e 10, é poque não saiu
update produtos set saldoestoque = (saldoestoque + 10);



ou seja atribuiria o valor do saldo de estoque mais o que esta no banco, com o JPA tive que ler o saldo atual, somar em uma variável e depois mandar fazer o update.

Sendo assim se alguém gravar o saldo antes do meu Update no JPA eu gravo um valor errado, e no SQL não gravaria.

Gostaria de ouvir opiniões sobre esta questão.

Obrigado pela atenção.
Fernando Silva

Fernando Silva

Responder

Posts

12/07/2014

Ronaldo Lanhellas

Bom, pelo que eu entendi seu problema é mais de concorrência do que com o JPA em si. Você tem que garantir que um dado seja consistente mesmo que 2 ou mais pessoas estejam alterando estes ao mesmo tempo.

Estude sobre "Lock Otimista / Lock Optimistic" no JPA e você encontrará a resposta. Em resumo, você controla seus objetos através de um "versionamento" e quando você tentar gravar no banco de dados determinado valor, se a versão do objeto mudou desde a última alteração sua então ele não deixará você gravar no banco para garantir a consistência dos dados.

Veja um link sobre o assunto: http://www.objectdb.com/java/jpa/persistence/lock#Optimistic_Locking_
Responder

Gostei + 0

12/07/2014

Fernando Silva

É em parte do sistema estou usando assim, vou ver qual a melhor saída.

Na verdade analisei e estou usando o version do JPA em cadastros e lançamentos do financeiro, mas para o estoque pensei que tinha algo semelhante ao SQL puro, para que eu não tivesse que tratar especificamente, pois se mando via SQL o banco cuida da requisição que chegou primeiro e faz commit e passa para próxima.

Talvez coloque até em uma trigger.
Responder

Gostei + 0

16/07/2014

Ronaldo Lanhellas

Você está falando a nível de banco de dados, que é outra camada mais externa. Lembre-se que no JPA os objetos são gravados no Persistence Context( cache) e só depois são sincronizados com o banco de dados (quando necessário), e no domínio da aplicação esse problema de concorrência pode ocorrer pois você ainda não está trabalhando com transações do banco, é outra camada.
Responder

Gostei + 0

16/07/2014

Fernando Silva

Você está falando a nível de banco de dados, que é outra camada mais externa. Lembre-se que no JPA os objetos são gravados no Persistence Context( cache) e só depois são sincronizados com o banco de dados (quando necessário), e no domínio da aplicação esse problema de concorrência pode ocorrer pois você ainda não está trabalhando com transações do banco, é outra camada.


Sim sei exatamente isto, inclusive desativei cache.

Porem considero o tópico resolvido, pois queria algo similar ao SQL, vou estudar e descobrir a melhor maneira, creio que será usar o o version nos objetos, para JPA, ou usar JDBC mesmo.


Obrigado pela atenção.
Responder

Gostei + 0

16/07/2014

Ronaldo Lanhellas

De nada meu caro, boa sorte no seu estudo.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar