Concorrência de Dados

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