Maison Java javaDidacticiel 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

Mar 27, 2017 am 10:30 AM

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; 
 } 
 
}
Copier après la connexion

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; 
 } 
 
}
Copier après la connexion

这里需要说明的是: 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 de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Générateur de nombres aléatoires en Java Générateur de nombres aléatoires en Java Aug 30, 2024 pm 04:27 PM

Guide du générateur de nombres aléatoires en Java. Nous discutons ici des fonctions en Java avec des exemples et de deux générateurs différents avec d'autres exemples.

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

See all articles