


Explication détaillée de l'exemple de code JDBC pour l'apprentissage de la gestion des transactions Java
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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

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.

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.

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.

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.

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.

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

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.

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
