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
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!???