Les principales versions de logiciel utilisées dans la rédaction de cet article sont les suivantes.
Le code ci-dessous récupère tous les ʻEMPNO d'une table appelée ʻEMP
et les renvoie vers la sortie standard.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Main {
public static void main(String[] args) {
String url = "jdbc:db2://<hostname>:<port>/<dbname>";
String user = "<user>";
String password = "<password>";
try (Connection con = DriverManager.getConnection(url, user, password)) {
con.setAutoCommit(false);
PreparedStatement ps = con.prepareStatement("SELECT * FROM EMP");
ResultSet rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("EMPNO"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Lorsque je compile et exécute ce code source, j'obtiens l'exception suivante après avoir imprimé tous les ʻEMPNO` sur la sortie standard:
com.ibm.db2.jcc.am.SqlException: [jcc][t4][10251][10308][4.26.14]Java pendant qu'une transaction est en cours sur la connexion.sql.Connection.close()A été demandé.
La transaction reste active et la connexion ne peut pas être fermée. CODE D'ERREUR=-4471, SQLSTATE=null
at com.ibm.db2.jcc.am.b7.a(b7.java:794)
at com.ibm.db2.jcc.am.b7.a(b7.java:66)
at com.ibm.db2.jcc.am.b7.a(b7.java:133)
at com.ibm.db2.jcc.am.Connection.checkForTransactionInProgress(Connection.java:1484)
at com.ibm.db2.jcc.t4.b.checkForTransactionInProgress(b.java:7581)
at com.ibm.db2.jcc.am.Connection.closeResourcesX(Connection.java:1507)
at com.ibm.db2.jcc.am.Connection.closeX(Connection.java:1493)
at com.ibm.db2.jcc.am.Connection.close(Connection.java:1470)
at Main.main(Main.java:22)
__java.sql.Connection.close ()
peut être compris car try-catch-with-resource
l'appelle sans permission, mais en premier lieu, "La transaction reste active et la connexion ne peut pas être fermée." Quel bordel ??? __.
Db2 nécessite que la transaction soit finalisée avec «COMMIT» ou «ROLLBACK» avant de fermer la connexion à la base de données. «COMMIT» et «ROLLBACK» ne sont effectués que lorsque des modifications sont apportées aux données de la base de données, telles que «INSERT» et «DELETE», et «COMMIT» et «ROLLBACK» sont exécutées pour «SELECT» qui se réfère uniquement aux données. Je suis sûr qu'il y a beaucoup de gens qui ne font pas attention, mais au moins dans Db2, vous devez être conscient des transactions, même dans le cas de SELECT
.
Dans le code source ci-dessus, l'autocommit a été désactivé (con.setAutoCommit (false)
). Si auto-commit = true, le pilote jdbc s'engage automatiquement lorsque vous appelez Connection :: close
, mais si auto-commit = false, le programmeur va explicitement Connection :: commit
ou. Si vous n'appelez pas Connection :: rollback
, la transaction ne sera pas finalisée. En d'autres termes, dans le code source ci-dessus, nous avons désactivé l'auto-commit, nous avons donc essayé de fermer la connexion sans confirmer la transaction, ce qui a abouti à ʻERRORCODE = -4471`.
--Call Connection :: commit
ou Connection :: rollback
pour terminer explicitement la transaction
--Définissez auto-commit = true et lancez l'achèvement de la transaction au pilote JDBC.
Est-ce la contre-mesure (´ ・ ω ・ `)
Recommended Posts