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 true
como 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 Connection
objeto 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 Connection
objeto 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 candidates
tabela e também atribuiremos algumas das habilidades ao candidato recém-inserido.
Realizaremos a inserção de um candidato e a atribuição de habilidades em uma transação. As etapas serão as seguintes:
- Insira um registro na
candidates
tabela e recupere o ID inserido. - Insira um conjunto de ID de candidato e ID de habilidade na
candidate_skills
tabela. - 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 candidates
antes de executar o programa.
SELECT * FROM candidates
ORDER BY id DESC;
Linguagem de código: Java ( java )
Agora, executamos o programa.
e verifique a candidates
tabela novamente:
e verifique a candidate_skills
tabela para ver se as atribuições estão lá.
SELECT * FROM candidate_skills;
Linguagem de código: Java ( java )
Como você pode ver, inserimos dados com sucesso na tabela candidates
e candidate_skills
na mesma transação.