Olá a todos,
Como posso implementar um lock no JPA para evitar esse tipo de erro : update conflicts with concurrent update
Obrigado
Olá a todos,
Como posso implementar um lock no JPA para evitar esse tipo de erro : update conflicts with concurrent update
Obrigado
http://weblogs.java.net/blog/caroljmcdonald/archive/2009/07/jpa_20_concurre.html
https://blogs.oracle.com/enterprisetechtips/entry/locking_and_concurrency_in_java
Obrigado
vou checar estes links
qualquer coisa eu posto aqui novamente
tveronezi mesmo checando os links não consegui fazer funcionar da forma que preciso
Vamos la vou expor a situação
tenho um sistema para escolas e se dois professores ao mesmo tempo por coincidencia forem apontar as faltas ( não importa se é a mesma classe ou nao ) eles chamam o mesmo metodo de insercao e quando isso ocorre ou acabo tomando um dead lock ou um update conflicts with concurrent update enfim ou não consegue gravar nada no banco ou acaba gravando parcialmente a lista de alunos, Utilizo Spring, JPA2, JSF2 ja tentei utilizar neste metodo jdbc puro para tentar bloquear a tabela enquanto a outra sessao esta ativa.
Um detalhe não posso alterar o modelo de dados.
Segue código do metodo:
public void _Insert(
String sGuid,
List<AcdTurmaAluno> alunoTurma,
Long lPlanoaulaDiscip,
Long lPlanoaualData) throws SQLException {
// AcdPlanoaulaApontamento novoApont = new AcdPlanoaulaApontamento();
// AcdPlanoaulaApontamentoPK novoApontPK = new AcdPlanoaulaApontamentoPK();
PreparedStatement preparedStatement = null;
String sql = null;
long id = 0L;
JdbcDAO jdbcDao = new JdbcDAO();
try {
connection = jdbcDao.getConnectionJdbc();
connection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
//sql = "SELECT * FROM ACD_PLANOAULA_APONTAMENTO FOR UPDATE";
//preparedStatement = connection.prepareStatement(sql);
//preparedStatement.execute();
for (AcdTurmaAluno aluno : alunoTurma) {
if (verificaApontamento(sGuid, aluno, lPlanoaulaDiscip, lPlanoaualData)) {
id = getTgrSequencialtabelasBean().getNextID(sGuid, "ACD_PLANOAULA_APONTAMENTO");
sql = "INSERT INTO ACD_PLANOAULA_APONTAMENTO "
+ "(ID_ACD_PLANOAULA_APONTAMENTO,ID_ACD_PLANOAULA_DISPENSA,"
+ "GUID,ID_ACD_PLANOAULA_DATA,ID_ACD_TURMA_ALUNO,"
+ "FG_PRESENCA,FG_PONTUALIDADE,SIGLA_PARTICIPACAO,DESC_COMENTARIO,"
+ "DT_CADASTRO,DT_ALTERACAO,ID_USUARIO_CAD,ID_USUARIO_ALT,"
+ "ID_ACD_PLANOAULA_DISCIP,ID_ACD_ALUNO_RESPONSAVEL,ID_TGR_EVENTO)"
+ " values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setLong(1, id);
preparedStatement.setString(2, null);
preparedStatement.setString(3, sGuid);
preparedStatement.setString(4, null);
preparedStatement.setLong(5, aluno.getAcdTurmaAlunoPK().getIdAcdTurmaAluno());
preparedStatement.setString(6, "N");
preparedStatement.setString(7, "S");
preparedStatement.setString(8, null);
preparedStatement.setString(9, null);
preparedStatement.setString(10, null);
preparedStatement.setString(11, null);
preparedStatement.setString(12, null);
preparedStatement.setString(13, null);
preparedStatement.setLong(14, lPlanoaulaDiscip);
preparedStatement.setString(15, null);
preparedStatement.setString(16, null);
preparedStatement.execute();
}
}
// novoApontPK.setGuid(sGuid);
//
// novoApontPK.setIdAcdPlanoaulaApontamento(getTgrSequencialtabelasBean().getNextID(sGuid, "ACD_PLANOAULA_APONTAMENTO"));
// novoApont.setAcdPlanoaulaApontamentoPK(novoApontPK);
//
// novoApont.setIdPlanoaulaDispensa(null);
// novoApont.setIdPlanoaulaData(null);
// novoApont.setIdTurmaAluno(alunoTurma.getAcdTurmaAlunoPK().getIdAcdTurmaAluno());
// novoApont.setFgPresenca("N");
// novoApont.setFgPontualidade("S");
// novoApont.setSiglaParticipacao(null);
// novoApont.setDescComentario(null);
// novoApont.setDtCadastro(null);
// novoApont.setDtAlteracao(null);
// novoApont.setIdUsuarioCad(null);
// novoApont.setIdUsuarioAlt(null);
// novoApont.setIdPlanoaulaDiscip(lPlanoaulaDiscip);
// novoApont.setIdAlunoRespons(null);
// novoApont.setIdTgrEvento(null);
// getAcdPlanoaulaApontamentoBean().inserir(novoApont);
} catch (Exception e) {
e.printStackTrace();
logger.error(new Date() + " - Ocorreu um erro na inserção do ACD_PLANOAULA_APONTAMENTO! ", e);
try {
connection.rollback();
} catch (Exception e1) {
e1.printStackTrace();
logger.error(new Date() + " - Ocorreu um erro na inserção do ACD_PLANOAULA_APONTAMENTO! ", e1);
}
} finally {
if (!connection.isClosed()) {
preparedStatement.close();
connection.close();
}
}
}
Agradeço quem puder ajudar.
Obrigado
Por favor alguém!???