A nova interface JDBC3.0 SavePoint fornece controle de transação adicional. A maioria dos DBMs modernos suporta SavePoints em seus ambientes, como o Oracle PL/SQL.
Defina um ponto de reversão lógica na transação ao definir um ponto de salvamento. Se ocorrer um erro quando um SalvePoint for passado, você poderá usar o método de reversão para desfazer todas as alterações ou apenas alterações feitas após o SavePoint.
Existem dois novos métodos para objetos de conexão para ajudar a gerenciar o SavePoints:
SetSavePoint (String SavePointName): define um novo SavePoint. Ele também retorna um objeto de salvamento.
RELEASESAVEPOINT (SAVEPOINTNO SOVEPOINTNAME): Exclua um SavePoint. Observe que ele requer um objeto SavePoint como um parâmetro. Este objeto é geralmente gerado pelo método setSavePoint ().
Existe um método Rollback (String SavePointName) que volta para o SalvePoint especificado.
O exemplo a seguir demonstra como usar um objeto SavePoint:
tente {// assumem um objeto de conexão válido Conn.SetAutocommit (false); Instrução stmt = conn.createstatement (); // Defina um salvpoint SalvePoint SalvePoint1 = Conn.SetSavePoint ("SavePoint1"); String sql = "inserir em funcionários" + "valores (106, 20, 'rita', 'tez')"; stmt.executeUpdate (SQL); // Envie uma declaração SQL malformada que quebra a string sql = "inserido em funcionários" + "valores (107, 22, 'sita', 'tez')"; stmt.executeUpdate (SQL); // Se não houver erro, comprometa as alterações. Conn.Commit ();} Catch (SqLexception SE) {// Se houver algum erro. Conn.Rollback (SavePoint1);} Nesse caso, nenhuma declaração de inserção acima terá sucesso e tudo será revertido.
Abaixo está um exemplo de uso do tutorial do SetSavePoint e da transação para descrever a reversão.
Esse código de amostra baseado no ambiente e na instalação do banco de dados no capítulo anterior foi explicado.
Copie o seguinte exemplo jdbcexample.java, compilar e execute o seguinte:
// Etapa 1. Importar pacotes necessários String final estática db_url = "jdbc: mysql: // localhost/empp"; // credenciais de banco de dados estático final string user = "nome de usuário"; estático final string pass = "senha"; public static void main (string [] args) {conexão conn = null; Instrução stmt = null; tente {// Etapa 2: Registre JDBC Driver Class.ForName ("com.mysql.jdbc.driver"); // Etapa 3: abra um sistema de conexão.out.println ("conectando ao banco de dados ..."); Conn = DriverManager.getConnection (db_url, usuário, passa); // Etapa 4: Defina o comprometimento automático como falso. Conn.SetAutocomit (false); // Etapa 5: execute uma consulta para excluir a declaração com // argumentos necessários para o exemplo RS. System.out.println ("Criando declaração ..."); stmt = conn.createstatement (); // Etapa 6: agora liste todos os registros disponíveis. String sql = "Selecione ID, primeiro, último, idade dos funcionários"; ResultSet rs = stmt.executeQuery (SQL); System.out.println ("Resultado da lista Conjunto de resultados para referência ...."); Printrs (RS); // Etapa 7: Exclua linhas com ralador de identificação de 104 //, mas salve o ponto antes de fazê -lo. SalvePoint SavePoint1 = Conn.SetSavePoint ("ROWS_DELEDED_1"); System.out.println ("Excluindo linha ..."); String sql = "Excluir dos funcionários" + "onde id = 110"; stmt.executeUpdate (SQL); // opa ... nós excluímos funcionários muito errados! // Etapa 8: reversão das alterações Afetr Salvar Point 2. Conn.Rollback (SavePoint1); // Etapa 9: Exclua linhas com ralador de identificação de 104 //, mas salve o ponto antes de fazê -lo. SavePoint SavePoint2 = Conn.SetSavePoint ("ROWS_DELEDED_2"); System.out.println ("Excluindo linha ..."); Sql = "Excluir dos funcionários" + "onde id = 95"; stmt.executeUpdate (SQL); // Etapa 10: agora liste todos os registros disponíveis. sql = "Selecione ID, primeiro, último, idade dos funcionários"; rs = stmt.executeQuery (SQL); System.out.println ("Resultado da lista Conjunto de referência ..."); Printrs (RS); // Etapa 10: ambiente de limpeza rs.close (); stmt.close (); Conn.Close (); } catch (sqlexception se) {// manipula erros para jdbc SE.printStackTrace (); // Se houver um erro, reverte as alterações. System.out.println ("Rolling Back Data aqui ..."); tente {if (conn! = null) conn.rollback (); } catch (sqLexception SE2) {SE2.PrintStackTrace (); } // End Try} Catch (Exceção e) {// Lidar com erros para class.ForName E.printStackTrace (); } finalmente {// Finalmente o bloco usado para fechar os recursos tente {if (stmt! = null) stmt.close (); } catch (sqLexception SE2) {} // nada que possamos fazer tente {if (conn! = null) conn.close (); } catch (sqLexception SE) {SE.printStackTrace (); } // End Finalmente tente} // End Try System.out.println ("Adeus!");} // END PRINCIPTÍTICO PRÚDICO PRÚDICO PRINTRS (ResultSet rs) lança sqLexception {// Verifique se começamos com a primeira linha rs.beforeFirst (); while (rs.Next ()) {// recuperar por nome da coluna int id = rs.getInt ("id"); int age = rs.getInt ("idade"); String primeiro = rs.getString ("primeiro"); String last = rs.getString ("last"); // Exibir valores system.out.print ("id:" + id); System.out.print (", idade:" + idade); System.out.print (", primeiro:" + primeiro); System.out.println (", last:" + last); } System.out.println (); } // end Printrs ()} // END JDBCEXAMPLEAgora vamos compilar o exemplo acima da seguinte forma:
C:> javac jdbcexample.java
Ao executar o JDBCExample, ele produz os seguintes resultados:
C:> Java Jdbcexample
Connecting to database...Creating statement...List result set for reference....ID: 95, Age: 20, First: Sima, Last: ChugID: 100, Age: 18, First: Zara, Last: AliID: 101, Age: 25, First: Mahnaz, Last: FatmaID: 102, Age: 30, First: Zaid, Last: KhanID: 103, Age: 30, First: Sumit, Last: MittalID: 110, Age: 20, First: SIMA, Último: ChugDeleting Row ... Excluindo a linha .... Resultado da lista Conjunto de referência .... id: 100, idade: 18, primeiro: zara, último: Aliid: 101, idade: 25, primeiro: mahnaz, último: gatmaid: 102, idade: 30, primeiro: zaid, último: Último: Khanid: 103, 10, 30 anos: 102, sumit: 30, MAI MIMBA: zaid, último: KHANID: 103, 103, 30 anos: primeiro: 202, Sumit: 30, MAIMA: Zaid, último: Khanid: 103, 103, 30 anos: Primeiro: Primeiro: Sumit, 30, MAI MA MIM.