2012-02-29 14 views
5

Estoy trabajando en una aplicación web escrita con PHP y utiliza SQL Server 2008. Para conectarme a la base de datos, utilicé SQLSRV driever de Microsoft. En una parte de esta aplicación, tengo que usar Transacciones SQL. Como sugirió Microsoft, lo hice exactamente en base a este artículo. Los principales procesos en mis códigos siga estos pasos: 1-
a partir de transacciones de SQL
2- enviar información a los archivos PHP a través de jQuery y comprobar el resultado enviado por JSON
3- reversión si el resultado era falso e ir a la siguiente consulta si fue verdadero.
4- comprometer transacciones si no se produjo ningún error y todos los resultados fueron correctos.¿Qué es el error "Nueva transacción no está permitida" en el controlador PHP y SQLSRV?

// This is my pseudo code 
if (sqlsrv_begin_transaction($sqlsrv->sqlsrvLink) === true) { 

    $firstQuery = sqlsrv_query($stmt1); 
    if (!$firstQuery) { 
    sqlsrv_rollback(); 
    } else { 
    $nextQuery = sqlsrv_query($stmt2); 
    if (!$nextQuery) { 
     sqlsrv_rollback(); 
    } else { 
     sqlsrv_commit(); 
    } 
    } 

} else { 
    print_r(sqlsrv_errors()); // Here is where I get the error below. 
} 

El problema que tengo es este error:

[Microsoft][SQL Server Native Client 10.0][SQL Server] New transaction is not allowed because there are other threads running in the session

estoy usando ver.2 controlador SQLSRV.
¿Para qué es este error? ¿Cómo puedo resolverlo?

que incluía el de mi propia clase sqlsrv a la primera parte de index.php contiene los siguientes métodos:

function __construct($dbServerName,$dbUsername,$dbPassword,$dbName) 
{ 
    $connectionInfo = array("Database"=> $dbName, "CharacterSet" => "UTF-8"); 
    $this->sqlsrvLink = sqlsrv_connect($dbServerName, $connectionInfo); 
    if ($this->sqlsrvLink === false) { 
     $this->sqlsrvError = sqlsrv_errors(); 
    } 
} 

function __destruct() 
{ 
    sqlsrv_close($this->sqlsrvLink); 
} 
+0

¿Cuándo ocurre este error: antes o después de "sqlsrv_query ($ stmt1);"? ¿Es posible que tenga "sqlsrv_begin_transaction" en algún lugar antes de este pseudo-código? – JScoobyCed

+0

@JScoobyCed: No, debe estar en el lugar actual. Esto no es una advertencia. Es un error Entonces detendrá todos los procesos. Ninguna de las 2 consultas no se ejecutará. –

+0

Quiero decir, ¿tiene otra llamada a "sqlsrv_begin_transaction" antes de este pseudo-código, por lo tanto, se quejaría de que ya se inició otra transacción. ¿Intentó depurar el código para que pueda identificar en qué línea de código ocurre el error? – JScoobyCed

Respuesta

1

creo que se debe establecer MultipleActiveResultSets a true cuando se quiere conectar con el servidor SQL:

$conn = sqlsrv_connect('127.0.0.1', array 
     (
      'Database' => 'Adventureworks', 
      'MultipleActiveResultSets' => true, // MARS ENABLED 
     )); 

http://php.net/manual/de/ref.pdo-sqlsrv.connection.php

+1

No resolvió mi problema ... –

0

Desde su error, parece que $nextQuery = sqlsrv_query($stmt2); está comenzando una nueva transacción i en la misma sesión ¿Puedes confirmar !$firstQuery antes de comenzar el segundo?

+1

Colin, ¿para qué sirve esta transacción? Absolutamente No. Tengo que comprometer la transacción si todas las partes de los procesos pueden tener éxito en sus operaciones. –

Cuestiones relacionadas