Maison  >  Article  >  Java  >  Explication détaillée de l'exemple de code JDBC pour l'apprentissage de la gestion des transactions Java

Explication détaillée de l'exemple de code JDBC pour l'apprentissage de la gestion des transactions Java

黄舟
黄舟original
2017-03-27 10:30:321232parcourir

Cet article présente principalement les informations pertinentes de JDBC pour l'apprentissage de la gestion des transactions Java. L'introduction dans l'article est très détaillée. Je pense qu'elle a une certaine valeur de référence pour tous les amis qui en ont besoin peuvent jeter un œil ci-dessous.

Qu'est-ce qu'une transaction Java

Le concept habituel est que les transactions sont uniquement liées aux bases de données.

Les transactions doivent être conformes aux principes ACID établis par l'ISO/IEC. ACID est l'abréviation d'atomicité, de cohérence, d'isolation et de durabilité. L'atomicité d'une transaction signifie que tout échec lors de l'exécution de la transaction entraînera l'invalidité de toutes les modifications apportées par la transaction. La cohérence signifie que lorsqu'une transaction échoue, toutes les données affectées par la transaction doivent être restaurées dans leur état avant l'exécution de la transaction. L'isolement signifie que les modifications apportées aux données pendant l'exécution de la transaction ne sont pas visibles par les autres transactions avant que la transaction ne soit validée. La persistance signifie que le statut des données soumises doit être correct lorsque l'exécution de la transaction échoue.

Au sens du profane, une transaction est un ensemble d'unités d'opération atomiques. Du point de vue de la base de données, il s'agit d'un ensemble d'instructions SQL, soit toutes sont exécutées avec succès si l'une des instructions l'est. exécutée de manière incorrecte pour une raison quelconque, puis annulez toutes les instructions précédemment exécutées. La réponse la plus simple est : soit toutes les exécutions réussissent, soit elles sont annulées et non exécutées.

Puisque la notion de transaction vient de la base de données, qu'est-ce qu'une transaction Java ? Quel est le lien ?

En fait, si un système d'application Java souhaite faire fonctionner une base de données, il est implémenté via JDBC. L'ajout, la modification et la suppression sont tous implémentés indirectement via les méthodes correspondantes, et le contrôle des transactions est également transféré en conséquence au code du programme Java. Par conséquent, les transactions d'exploitation de base de données sont traditionnellement appelées transactions Java.

Caractéristiques des transactions :

1) Atomicité : Les transactions sont des unités logiques de travail dans la base de données et doivent être des unités de travail atomiques, pour leur modifications de données, toutes ou aucune ne sera exécutée.

2) Cohérence : Lorsqu'une transaction est terminée, toutes les données doivent être cohérentes. Dans la base de données concernée, toutes les règles doivent être appliquées aux modifications des transactions afin de maintenir l'intégrité de toutes les données.

3) Isolement : L'exécution d'une transaction ne peut pas être affectée par d'autres transactions.

4) Durabilité : Une fois qu'une transaction est soumise, le fonctionnement de la transaction est stocké en permanence dans la base de données. Même si vous effectuez une opération de restauration à ce moment-là, les modifications ne seront pas annulées.

Transaction : il s'agit d'une unité de contrôle de concurrence et d'une séquence d'opérations définie par l'utilisateur. Soit toutes ces opérations sont effectuées, soit aucune d’entre elles n’est effectuée, et elles constituent une unité de travail intégrale. Grâce aux transactions, SQL Server peut lier un ensemble d’opérations logiquement liées afin que le serveur préserve l’intégrité des données. Une transaction commence généralement par le début de la transaction et se termine par une validation ou une annulation. Commint signifie soumission, c'est-à-dire toutes les opérations de validation d'une transaction. Plus précisément, toutes les mises à jour des données de la transaction sont réécrites dans la base de données physique sur le disque et la transaction se termine normalement. Rollback signifie restauration, c'est-à-dire qu'une sorte d'échec se produit pendant l'exécution de la transaction et que la transaction ne peut pas continuer. Le système annule toutes les opérations terminées sur la base de données dans la transaction et revient à l'état dans lequel la transaction a commencé.

Transactions à validation automatique : chaque relevé individuel est une transaction. Il y a un commit implicite après chaque instruction. (Par défaut)

Transaction explicite : commence par le début de l'affichage de la transaction et se termine par une validation ou une annulation.

Transaction implicite : lorsque la connexion fonctionne en mode transaction implicite, l'instance du moteur de base de données SQL Server démarre automatiquement une nouvelle transaction après avoir validé ou annulé la transaction en cours. Il n'est pas nécessaire de décrire le début des choses, il suffit de valider ou d'annuler chaque transaction. Mais chaque transaction se termine toujours explicitement par une validation ou une annulation. Une fois que la connexion a défini le mode de transaction implicite sur ouvert, une transaction implicite sera automatiquement démarrée lorsque l'instance du moteur de base de données exécute l'une des instructions suivantes pour la première fois : alter table, insert, create, open, delete , révoquer, supprimer, sélectionner, récupérer, tronquer la table, accorder, mettre à jour, la transaction restera valide jusqu'à ce qu'une instruction de validation ou d'annulation soit émise. Une fois la première transaction validée ou annulée, l'instance du moteur de base de données démarre automatiquement une nouvelle transaction la prochaine fois que la connexion exécute l'une des instructions ci-dessus. Cette instance continuera à générer des chaînes de transactions implicites jusqu'à ce que le mode de transaction implicite soit désactivé.

Gestion des transactions JDBC

Comment gérer les transactions lors de l'utilisation de JDBC. Jetez un oeil directement au code

Exemple de code

/** 
 * @Title: JDBCTrans.java 
 * @Package com.oscar999.trans 
 * @Description: 
 * @author XM 
 * @date Feb 14, 2017 4:38:27 PM 
 * @version V1.0 
 */ 
package com.oscar999.trans; 
 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import java.sql.Statement; 
 
/** 
 * @author 
 * 
 */ 
public class JDBCTrans { 
 
 public JDBCTrans() { 
 
 } 
 
 /** 
 * 
 * @param sHostName 
 * @param sPortNumber 
 * @param sSid 
 * @param userName 
 * @param password 
 * @return 
 * @throws SQLException 
 */ 
 public Connection getConnection(String sHostName, String sPortNumber, String sSid, String userName, String password) throws SQLException { 
 Connection conn = null; 
 String url = getOraclURL(sHostName, sPortNumber, sSid); 
 conn = DriverManager.getConnection(url,userName,password); 
 return conn; 
 } 
 
 /** 
 * 
 * @param conn 
 * @param sql 
 * @throws SQLException 
 */ 
 public void add(Connection conn, String sql) throws SQLException { 
 Statement stmt = null; 
 try { 
  stmt = conn.createStatement(); 
  stmt.execute(sql); 
 } catch (SQLException e) { 
  // TODO Auto-generated catch block 
  e.printStackTrace(); 
 } finally { 
  if (stmt != null) 
  stmt.close(); 
 } 
 } 
 
 /** 
 * @param args 
 */ 
 public static void main(String[] args) { 
 // TODO Auto-generated method stub 
 String sHostName = ""; 
 String sPortNumber = ""; 
 String sSid = ""; 
 String userName = ""; 
 String password = ""; 
 
 sHostName = ""; 
 sPortNumber = ""; 
 sSid = ""; 
 userName = ""; 
 password = ""; 
 
 try { 
  Class.forName("oracle.jdbc.driver.OracleDriver"); 
 } catch (ClassNotFoundException e1) { 
  // TODO Auto-generated catch block 
  e1.printStackTrace(); 
 } 
  
 JDBCTrans jdbcTrans = new JDBCTrans(); 
 Connection conn = null; 
 try {  
  conn = jdbcTrans.getConnection(sHostName, sPortNumber, sSid, userName, password); 
  conn.setAutoCommit(false);// can't insert, update 
  
  //1. add SQL 
  String addSQL = "insert into TEST_TABLE values('name1','value1')"; 
  jdbcTrans.add(conn,addSQL); 
  
 } catch (SQLException e) { 
  // TODO Auto-generated catch block 
  e.printStackTrace(); 
 } finally { 
  /*if (conn != null) 
  { 
  try { 
   conn.close(); 
  } catch (SQLException e) { 
   // TODO Auto-generated catch block 
   e.printStackTrace(); 
  } 
  }*/ 
 } 
 
 } 
 
 private String getOraclURL(String sHostName, String sPortNumber, String sSid) { 
 String url = "jdbc:oracle:thin:@" + sHostName + ":" + sPortNumber + ":" + sSid; 
 return url; 
 } 
 
}

Pour le code ci-dessus, la description est la suivante :

Combien de codes y a-t-il dans le code ci-dessus ? Une partie de l'explication :

1 conn.setAutoCommit(false) Ne validez pas la transaction après l'exécution.

n'a aucun effet sur Select, mais pour Insert et Update, les données ne seront pas modifiées si elles ne sont pas soumises

2.  conn.close(); 关闭Connection的代码有被Mark掉, 是想呈现conn.setAutoCommit(false)的效果。

原因是在 Connection Close的时候会执行一次Commit.

而如果Connection是在应用服务器中使用连接池的话, Connection就不会被Close, 也就不会执行Commit.

3. setAutoCommit(false) 用法大多数是在要执行多条语句才提交。

所以针对以上第三点, 更接近实际的状况的代码如示例代码2

示例代码2

/** 
 * @Title: JDBCTrans.java 
 * @Package com.oscar999.trans 
 * @Description: 
 * @author XM 
 * @date Feb 14, 2017 4:38:27 PM 
 * @version V1.0 
 */ 
package com.oscar999.trans; 
 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import java.sql.Statement; 
 
/** 
 * @author 
 * 
 */ 
public class JDBCTrans { 
 
 public JDBCTrans() { 
 
 } 
 
 /** 
 * 
 * @param sHostName 
 * @param sPortNumber 
 * @param sSid 
 * @param userName 
 * @param password 
 * @return 
 * @throws SQLException 
 */ 
 public Connection getConnection(String sHostName, String sPortNumber, String sSid, String userName, String password) throws SQLException { 
 Connection conn = null; 
 String url = getOraclURL(sHostName, sPortNumber, sSid); 
 conn = DriverManager.getConnection(url, userName, password); 
 return conn; 
 } 
 
 /** 
 * 
 * @param conn 
 * @param sql 
 * @throws SQLException 
 */ 
 public void add(Connection conn, String sql) throws SQLException { 
 Statement stmt = null; 
 try { 
  stmt = conn.createStatement(); 
  stmt.execute(sql); 
 } catch (SQLException e) { 
  // TODO Auto-generated catch block 
  e.printStackTrace(); 
 } finally { 
  if (stmt != null) 
  stmt.close(); 
 } 
 } 
 
 /** 
 * @param args 
 */ 
 public static void main(String[] args) { 
 // TODO Auto-generated method stub 
 String sHostName = ""; 
 String sPortNumber = ""; 
 String sSid = ""; 
 String userName = ""; 
 String password = ""; 
 
 sHostName = ""; 
 sPortNumber = ""; 
 sSid = ""; 
 userName = ""; 
 password = ""; 
 
 try { 
  Class.forName("oracle.jdbc.driver.OracleDriver"); 
 } catch (ClassNotFoundException e1) { 
  // TODO Auto-generated catch block 
  e1.printStackTrace(); 
 } 
 
 JDBCTrans jdbcTrans = new JDBCTrans(); 
 Connection conn = null; 
 try { 
  conn = jdbcTrans.getConnection(sHostName, sPortNumber, sSid, userName, password); 
  conn.setAutoCommit(false);// can't insert, update 
 
  // 1. add SQL 1 
  String addSQL = "insert into TEST_TABLE values('name1','value1')"; 
  jdbcTrans.add(conn, addSQL); 
 
  //2. add SQL 2 
  addSQL = "insert into TEST_TABLE values('name2','value2')"; 
  jdbcTrans.add(conn, addSQL); 
  
  conn.commit(); 
 } catch (SQLException e) { 
  // TODO Auto-generated catch block 
  if(conn!=null){ 
   try { 
   conn.rollback(); 
   } catch (SQLException e1) { 
   e1.printStackTrace(); 
   } 
  }  
  e.printStackTrace(); 
 } finally { 
  if (conn != null) { 
  try { 
   conn.close(); 
  } catch (SQLException e) { 
   // TODO Auto-generated catch block 
   e.printStackTrace(); 
  } 
  } 
 } 
 
 } 
 
 private String getOraclURL(String sHostName, String sPortNumber, String sSid) { 
 String url = "jdbc:oracle:thin:@" + sHostName + ":" + sPortNumber + ":" + sSid; 
 return url; 
 } 
 
}

这里需要说明的是: conn.rollback(); 

只要执行有异常,就要rollback , 这一步必不可少

如果没有在执行出现异常的时候进行回滚。如果在执行第一条语句之后出现异常,con既没有提交也没有回滚,表就会被锁住(如果oracle数据库就是行锁),而这个锁却没有机会释放。

可能在执行con.close()的时候会释放锁,但还是如果应用服务器使用了数据库连接池,连接不会被断开。

总结

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn