PRB: No se puede iniciar una conexión mientras está en modo de transacción Manual clonada

Exención de responsabilidades de contenido KB retirado

Este artículo se refiere a productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

Síntomas

Mientras utiliza el controlador de Microsoft SQL Server 2000 para JDBC, puede experimentar la siguiente excepción:
java.sql.SQLException: [Microsoft] [controlador de SQL Server 2000 para JDBC] no puede iniciar una conexión mientras está en modo de transacción manual clonada.

Causa

Este error se produce al intentar ejecutar varias instrucciones en una base de datos de SQL Server con el controlador JDBC en el modo de transacción manual (AutoCommit = false) y al utilizar directamente (SelectMethod = direct) modo. El modo directo es el modo predeterminado para el controlador.

Solución

Cuando utilice el modo de transacción manual, debe establecer la propiedad SelectMethod del controlador de cursor o asegúrese de que utiliza sólo una instrucción activa en cada conexión, tal como se especifica en la sección "Más información" de este artículo.

Estado

Este comportamiento es por diseño.

Más información

Pasos para reproducir el comportamiento

Para reproducir el error, utilice el código siguiente:

Nota: consulte los comentarios en el código para obtener información sobre los cambios de código necesarios para resolver el problema.
import java.sql.*;import java.io.*;


public class Repro{

public static void main(String args[])
{
try {
Connection con;
Statement s1 = null;
ResultSet r1 = null;
Statement s2 = null;
ResultSet r2 = null;
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
con = DriverManager.getConnection(
"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs;SelectMethod=Direct;User=User;Password=Password");
//fix 1
//"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs;SelectMethod=Cursor;User=User;Password=Password");
con.setAutoCommit(false);

try {
s1 = con.createStatement();
r1 = s1.executeQuery("SELECT * FROM authors");

//fix 2
//r1.close();
//s1.close();

s2 = con.createStatement();
r2 = s2.executeQuery("SELECT * FROM publishers");
}
catch (SQLException ex)
{
System.out.println(ex);
}

}
catch (Exception e)
{
e.printStackTrace();
}
}
}

Referencias

Para obtener más información acerca de las conexiones de clonar, consulte la sección de propiedades de la cadena de conexión del controlador Microsoft SQL Server 2000 para JDBC HTML ayuda o la guía en pantalla. Para obtener información adicional acerca de las conexiones clonadas con el controlador, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

313220 PRB: inesperadas conexiones a SQL Server con JDBC
Propiedades

Id. de artículo: 313181 - Última revisión: 22 ene. 2017 - Revisión: 1

Comentarios