1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

controle de transação JDBC manual

Boa tarde galera,

Estou com dificuldades de implementar um controle de transação no aplicativo que estou trabalhando, bem, vou expor os cenário que estou passando:

  • preciso fazer a inserção de uma tabela pai, e tabela com os registros filhos, se caso algum filho falhe na inserção, não deve comitar nada, ou seja rollback.

  • estou utilizando o servidor de aplicação WildFly e banco de dados DB2, não estou usando Hibernate por vários motivos e nem há possibilidade de utilizá-lo, estamos usando JDBC puro.

o que eu já fiz e não funcionou:

  • tentei setar a propriedade da conexão como false, mas não é permitido, pois diz que não pode fazer isto com uma conexão gerenciada.
conn = ... // get connection
   conn.setAutoCommit(false);
  • criei um xa-datasource além de um datasource comun, olhando vários exemplos de trabalho com o mesmo, tentei fazer o seguinte código de teste, em resumo, teria que fazer os inserts (sem comitar) depois verificar se os 2 inserts podem ser comitados, e por fim, finalizar os 2 inserts, caso um falhe, não comita nada, mas neste exemplo, se passa no insert 1, e no outro viola uma chave primária, ele já estoura erro de integridade, o estranho é que não comita a primeira, está certo o comportamento, mas pelo que eu entendi do controle de transação em várias fazes, teria que só quando o ret = xaRes.prepare(xid); fosse chamado faria uma verificação de integridade.
        XADataSource xaDS;
        XAConnection xaCon;
        XAResource xaRes;
        Xid xid;
        Connection con;
        int ret;

        try {

            DB2XADataSource db2XaDs = new DB2XADataSource();
            db2XaDs.setDataSourceName("BancoXADS");
            db2XaDs.setDatabaseName("CACIQUE");
            db2XaDs.setServerName("192.168.1.171");
            db2XaDs.setPortNumber(50000);
            db2XaDs.setUser("dba");
            db2XaDs.setPassword("123456");
            xaCon = db2XaDs.getXAConnection();

            xaRes = xaCon.getXAResource();
            con = xaCon.getConnection();

            byte[] gtrid = new byte[] { 0x44, 0x11, 0x55, 0x66 };
            byte[] bqual = new byte[] { 0x00, 0x22, 0x00 };
            xid = new com.ibm.db2.jcc.DB2Xid(100, gtrid, bqual);

            try {
                xaRes.start(xid, XAResource.TMNOFLAGS);

                Statement stmt1 = con.createStatement();
                stmt1.executeUpdate("insert into cargo (IDCARGO, DESCRCARGO) values (6, 'donte believe')");

                Statement stmt2 = con.createStatement();
                stmt2.executeUpdate("insert into CHAMADOS_CATEGORIA(IDCATEGORIA, DESCRCATEGORIA) values (5, 'farinha')");

                xaRes.end(xid, XAResource.TMSUCCESS);

                ret = xaRes.prepare(xid);
                if (ret == XAResource.XA_OK) {
                    xaRes.commit(xid, false);
                } else {
                    xaRes.rollback(xid);
                }
            } catch (Exception e) {
                e.printStackTrace();
                xaRes.rollback(xid);
            } finally {
                con.close();
                xaCon.close();
            }

alguém já passou por este cenário, sabe como posso fazer um controle de transação neste cenário?

Obrigado.

  • Onde eu trabalho eu também faço algo parecido. Mas eu faço assim, tento o primeiro insert, se der certo, eu chamo outra classe que faz o segundo insert, se a segunda der certo, dou o commit da segundo e depois da primeira.

    mariogpr   24 de jul de 2014
  • Dá alguma exceção quando vc faz setAutoCommit(false);? Qual?

    lucastody   24 de jul de 2014
  • java.sql.SQLException: You cannot set autocommit during a managed transaction!

    Eduardo Vendruscolo   24 de jul de 2014
  • Atualizei minha resposta (EDIT 1)

    lucastody   24 de jul de 2014
  • Iai bixo, deu certo?

    lucastody   25 de jul de 2014
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags jdbc java db2 wildfly transações banco-de-dados ou faça a sua própria pergunta.