Eu tenho aa questão de concorrência I tentou resolver com um loop while que tenta salvar uma entidade várias vezes até que ela atinge alguns contagem de repetições max. Eu gostaria de evitar falar sobre se deve ou não existem outras maneiras de resolver esse problema. Eu tenho outras mensagens StackOverflow sobre isso. :) É uma longa história curta: existe uma restrição exclusiva em uma coluna que é derivada e incluir uma parte numérica que continua incrementando para evitar colisão. Em um loop, I:
Tudo isso parece trabalho, exceto quando o loop volta para o passo 1 e tentativas para seleccionar, eu recebo:
17:20:46,111 INFO [org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl] (http-localhost/127.0.0.1:8080-3) HHH000010: On release of batch it still contained JDBC statements
17:20:46,111 INFO [my.Class] (http-localhost/127.0.0.1:8080-3) MESSAGE="Failed to save to database. Will retry (retry count now at: 9) Exception: could not execute statement; SQL [n/a]; constraint [SCHEMA_NAME.UNIQUE_CONSTRAINT_NAME]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement"
E uma nova exceção é capturado. Parece que o primeiro rubor que causa a violação de restrição único e lança o DataAccessException
não limpa lote do gerente entidade. Qual a maneira apropriada de lidar com isso? Estou usando Spring com JPA e não têm acesso direto ao gerente entidade. Acho que poderia injetar se eu precisar, mas isso é uma solução dolorosa para esse problemas.
Não pode fazer isso - uma vez que lave algo e ele falhar e uma exceção é lançada, a transação será marcada como retrocesso. Isso significa que não importa que você pegar a exceção e continuar, você vai acabar com a reversão. Na verdade ele não importa em tudo o que exceção foi lançada - pelo gerente de transação padrão de Primavera irá reverter em cada desmarcada exceções. Você pode superá-lo, definindo especificamente um noRollbackFor
na @Transactional
anotação (desde que você estiver usando transações motorista anotação)
Edit - Também não irá ajudá-lo no caso de esta violação de restrição, pois a operação será provavelmente marcada como reversão no nível da base de dados.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras