Transação MySQL JDBC

Neste tutorial, você aprenderá como usar os métodos commit() e rollback() do objeto Connection para controlar transações.

Configurando o modo de confirmação automática

Quando você se conecta a bancos de dados MySQL , o modo de confirmação automática é definido truecomo padrão. Isso significa que as alterações serão aplicadas ao banco de dados assim que a instrução for executada com sucesso.

Caso você queira controlar quando confirmar a transação, você chama o setAutoCommit()método do Connectionobjeto da seguinte forma:

Connection conn = DriverManager.getConnection(dbURL,dbUser,dbPassword);
conn.setAutoCommit(false);Linguagem de código:  Java  ( java )

Depois de definir o modo de confirmação automática como false, você pode chamar commit()ou rollback()métodos do Connectionobjeto para confirmar ou reverter a transação.

Observe que você deve sempre chamar setAutoCommit()o método logo após abrir uma conexão com o banco de dados.

Confirmando e revertendo uma transação

Depois que o modo de confirmação automática estiver definido como false, você poderá confirmar ou reverter a transação. O fluxo de uso desses métodos é o seguinte:

try(Connection conn = DriverManager.getConnection(dbURL,dbUser,dbPassword);){
   conn.setAutoCommit(false);
	
   // perform operations such as insert, update, delete here
   // ..
	
   // if everything is OK, commit the transaction
   conn.commit();

} catch(SQLException e) {
   // in case of exception, rollback the transaction
   conn.rollback();
}Linguagem de código:  Java  ( java )

Exemplo de transação MySQL JDBC

Neste exemplo, inseriremos um novo registro na candidatestabela e também atribuiremos algumas das habilidades ao candidato recém-inserido.

diagrama de banco de dados de exemplo mysql jdbc

Realizaremos a inserção de um candidato e a atribuição de habilidades em uma transação. As etapas serão as seguintes:

  1. Insira um registro na candidatestabela e recupere o ID inserido.
  2. Insira um conjunto de ID de candidato e ID de habilidade na candidate_skillstabela.
  3. Se todas as operações acima forem bem-sucedidas, confirme a transação, caso contrário, reverta-a.

A seguir está um exemplo completo de uso de uma transação JDBC.

package org.mysqltutorial;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 *
 * @author tutorials.acervolima.com
 */
public class Main {
  /**
   * Insert and assign skills to a specific candidates
   * @param firstName
   * @param lastName
   * @param dob
   * @param email
   * @param phone
   * @param skills 
   */
    public static void addCandidate(String firstName,String lastName,Date dob, 
                                    String email, String phone, int[] skills) {
        
        Connection conn = null;
        
        // for insert a new candidate
        PreparedStatement pstmt = null;
        
        // for assign skills to candidate
        PreparedStatement pstmtAssignment = null;
        
        // for getting candidate id
        ResultSet rs = null;

        try {
            conn = MySQLJDBCUtil.getConnection();
            // set auto commit to false
            conn.setAutoCommit(false);
            // 
            // Insert candidate
            // 
            String sqlInsert = "INSERT INTO candidates(first_name,last_name,dob,phone,email) "
                              + "VALUES(?,?,?,?,?)";
            
            pstmt = conn.prepareStatement(sqlInsert,Statement.RETURN_GENERATED_KEYS);

            pstmt.setString(1, firstName);
            pstmt.setString(2, lastName);
            pstmt.setDate(3, dob);
            pstmt.setString(4, phone);
            pstmt.setString(5, email);

            int rowAffected = pstmt.executeUpdate();
            
             // get candidate id
            rs = pstmt.getGeneratedKeys();
            int candidateId = 0;
            if(rs.next())
                candidateId = rs.getInt(1);
            //    
            // in case the insert operation successes, assign skills to candidate
            //
            if(rowAffected == 1)
            {
                // assign skills to candidates
                String sqlPivot = "INSERT INTO candidate_skills(candidate_id,skill_id) "
                                 + "VALUES(?,?)";
                
                pstmtAssignment = conn.prepareStatement(sqlPivot);
                for(int skillId : skills) {
                    
                    pstmtAssignment.setInt(1, candidateId);
                    pstmtAssignment.setInt(2, skillId);
                    
                    pstmtAssignment.executeUpdate();
                }
                conn.commit();
            } else {
                conn.rollback();
            }
        } catch (SQLException ex) {
            // roll back the transaction
            try{
                if(conn != null)
                    conn.rollback();
            }catch(SQLException e){
                System.out.println(e.getMessage());
            }
            
            
            System.out.println(ex.getMessage());
        } finally {
            try {
                if(rs != null)  rs.close();
                if(pstmt != null) pstmt.close();
                if(pstmtAssignment != null) pstmtAssignment.close();
                if(conn != null) conn.close();
                
            } catch (SQLException e) {
                System.out.println(e.getMessage());
            }
        }
    }

    public static void main(String[] args) {
       // insert and assign skills 
        int[] skills = {1,2,3};
        addCandidate("John", "Doe", Date.valueOf("1990-01-04"), 
                        "[email protected]", "(408) 898-5641", skills);
    }
}Linguagem de código:  Java  ( java )

Vamos verificar a tabela candidatesantes de executar o programa.

SELECT * FROM candidates
ORDER BY id DESC;Linguagem de código:  Java  ( java )
tabela_candidatos

Agora, executamos o programa.

transação jdbc

e verifique a candidatestabela novamente:

exemplo de transação jdbc

e verifique a candidate_skillstabela para ver se as atribuições estão lá.

SELECT * FROM candidate_skills;Linguagem de código:  Java  ( java )
tabela candidate_skills

Como você pode ver, inserimos dados com sucesso na tabela candidatese candidate_skillsna mesma transação.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *