Cet article décrit la mise en œuvre Java des transactions, des transferts bancaires et des marchandises dans et hors des entrepôts en fonction de JDBC. Partagez-le pour votre référence, comme suit:
1. Transfert Business
Lorsque le transfert doit exécuter 2 instructions SQL (mise à jour des mises à jour) et les deux sont réussies, la transaction est soumise. Si l'on échoue, les deux reculeront la transaction.
2. Une transaction doit avoir 4 attributs : l'atomicité, la cohérence, l'isolement et la persistance. Ces quatre attributs sont généralement appelés attributs acides.
① Atomicité. Une transaction est une unité de travail inséparable, et toutes les opérations incluses dans la transaction sont effectuées ou non.
② Cohérence. Une transaction doit être de modifier la base de données d'un état cohérent à un autre. La cohérence est étroitement liée à l'atomicité.
③ Isolement. L'exécution d'une transaction ne peut pas être interférée par d'autres transactions. Autrement dit, les opérations d'une transaction et les données utilisées sont isolées des autres transactions simultanées, et les transactions exécutées simultanément ne peuvent pas interférer entre elles.
④ Durabilité. La permanence est également appelée permanence, ce qui signifie qu'une fois une transaction engagée, ses modifications apportées aux données de la base de données doivent être permanentes. D'autres opérations ou échecs ultérieurs ne devraient avoir aucun impact sur eux.
3. Voici une description de démonstration utilisant l'opération de transfert comme cas, et les points d'attention sont les suivants:
(1) Une opération de relevé SQL ne nécessite pas de soumission de transaction manuelle
(2) L'opération de requête ne nécessite pas de soumission de transaction manuelle.
(3) Cependant, la mise à jour, l'insertion et la suppression nécessitent une soumission de transaction manuelle
(4) Si l'équilibre est négatif, vous pouvez d'abord interroger les résultats, puis porter un jugement, puis fonctionner
(5) con.setAutoCommit(false); démarrer manuellement la transaction; con.commit(); commettre manuellement la transaction; con.rollback(); opération de recul des transactions
4. Créez d'abord un tableau de données ou deux tables de données. Ici, créez deux tables de données pour plus de clarté de démonstration.
5. Créez une base de données et une table de données, puis écrivez la classe d'outils basez-bas.
Package com.bie.utils; import java.sql.connection; import java.sql.drivermanager; import java.sql.preparedstatement; import java.sql.resultSet; classe pour se connecter à la base de données * / classe publique Basedao {private static string driver = "com.mysql.jdbc.Driver"; Url de chaîne statique privée = "jdbc: mysql: /// test"; chaîne statique privée user = "root"; String statique privé Password = "123456"; / *** * Méthode pour se connecter à la base de données * @return * @throws classNotFoundException * @throws sqlexception * / public static connection getCon () lève classNotFoundException, sqlexception {class.forname (pilote); // charger le pilote de base de données System.out.println ("Tester la charge de données avec succès"); Connexion Con = driverManager.getConnection (URL, utilisateur, mot de passe); System.out.println ("Test de base de données Lien avec succès"); retour con; } / *** * Méthode pour fermer la base de données * @param con * @param ps * @param rs * / public static void close (connexion con, préparestation ps, resultSet rs) {if (rs! = Null) {// Fermez la ressource pour éviter l'exception try {Rs.close (); } catch (sqlexception e) {// TODO Block de catch généré automatiquement e.printStackTrace (); }} if (ps! = null) {try {ps.close (); } catch (sqlexception e) {// TODO Block de catch généré automatiquement e.printStackTrace (); }} if (con! = null) {try {con.close (); } catch (sqlexception e) {// TODO Block de catch généré automatiquement e.printStackTrace (); }}} / *** * Acceptez la méthode d'ajout, de supprimer et de modifier * @param sql * @param arr * @return * / public static boolean addupDateDelete (String sql, objet [] arr) {connexion con = null; PréparedStatement PS = null; essayez {con = basasedao.getCon (); // étape 1: opération pour se connecter à la base de données ps = con.preparestatement (sql); // étape 2: précompilé // étape 3: définissez la valeur if (arr! = null && arr.length! = 0) {for (int i = 0; i <arr.Length; i ++) {ps.setoBject (i + 1, i + 1); }} int count = ps.ExecuteUpdate (); // Étape 4: Exécutez l'instruction SQL if (count> 0) {return true; } else {return false; }} catch (classNotFoundException e) {// TODO Block de catch généré automatiquement e.printStackTrace (); } catch (sqlexception e) {// TODO Block de catch généré automatiquement e.printStackTrace (); } return false; } / * public static void main (String [] args) {try {basasedao.getCon (); } catch (classNotFoundException e) {// TODO Generated Catch Block E.PrintStackTrace (); } catch (sqlexception e) {// TODO Block de catch généré automatiquement e.printStackTrace (); }} * /}6. Le test est directement effectué dans la méthode principale, j'ai donc écrit UserDao pour les tests et je regarde l'effet.
Package com.bie.dao; Importer java.sql.connection; import java.sql.preparedstatement; import java.sql.sqlexception; import com.bie.utils.basedao; / *** @Author Biehongli * @version CRIME TEMPS: 27 février 2017 à 3:19:49 pm ** * Remarque: * (1) Une opération de relevé SQL ne nécessite pas de soumission de transaction manuelle * (2) L'opération de requête ne nécessite pas de soumission de transaction manuelle, * (3) Cependant, la mise à jour, l'insertion et la suppression nécessitent la soumission des transactions manuelles * (4) Si le solde est négatif, vous pouvez interroger le résultat d'abord, puis le juger, puis les opérer * @param args * / public static Void Main (String [] args) {Connection Con = null; PréparedStatement PS1 = NULL; PréparedStatement PS2 = null; essayez {// étape 1: le fonctionnement de la connexion à la base de données con = basasedao.getCon (); // La transaction est automatiquement soumise par défaut, donc la valeur par défaut est vraie. Changez maintenant true en false, et la transaction automatique par défaut est interdite //con.setautoCommit(True); // Transaction 1: Si défini sur FALSE, la transaction doit être soumise manuellement con.setAutoCommit (false); // Étape 2: La chaîne d'instruction SQL mise à jour sql = "Update Bank_A set usera_rmb = usera_rmb-500 où usera_id = 1"; String Sql2 = "Update Bank_B SET USERB_RMB = UserB_RMB + 500 WHERE USERB_ID = 1"; // Étape 3: précompilé SQL PS1 = CON.PrepareStatement (SQL); // Étape 4: Exécutez l'instruction SQL. Bien que SQL ait été exécuté, il n'a pas été persisté et mis à jour dans la base de données ps1.executeupdate (); // Étape 3: précompilé sql2 ps2 = con.preparestatement (sql2); // Étape 4: Exécuter SQL2. Bien que SQL2 soit exécuté, il n'a pas été persisté et mis à jour dans la base de données ps2.executeupdate (); System.out.println ("Transfer réussi ..."); // Transaction 2: engager manuellement la transaction. Si les deux exécutions réussissent, engagez la transaction con.Commit (); } catch (classNotFoundException e) {e.printStackTrace (); Essayez {// Transaction 3: Si une exception est lancée, retirez la transaction con.rollback (); } catch (sqlexception e1) {e1.printStackTrace (); }} catch (sqlexception e) {e.printStackTrace (); } Enfin {// Fermez la ressource pour éviter les exceptions basez-basesa.close (con, ps1, null); Basedao.close (null, ps2, null); }}}L'effet de démonstration est le suivant:
Pour plus d'informations sur le contenu lié à Java, veuillez consulter les sujets de ce site: "Résumé des compétences de Java pour faire fonctionner les bases de données à l'aide de JDBC", "Résumé de Java + MySQL Database Programming", "Tutorial on Java Data structure Compétences en fonctionnement "
J'espère que cet article sera utile à la programmation Java de tous.