Что означает ошибка «Новая транзакция не разрешена» в драйвере PHP и SQLSRV? - PullRequest
5 голосов
/ 29 февраля 2012

Я работаю над веб-приложением, написанным на PHP и использующим SQL Server 2008. Для подключения к базе данных я использовал SQLSRV driever от Microsoft.В части этого приложения я должен использовать транзакции SQL.Как предложила Microsoft, я сделал это именно на основе этой статьи.Основные процессы в моих кодах выполняются следующим образом:
1 - запуск транзакции sql
2 - отправка информации в файлы PHP через jQuery и проверка результата, отправленного JSON
3 - откат, если результат был ложным, и переходк следующему запросу, если он был истинным.
4 - зафиксировать транзакции, если не было ошибок и все результаты были в порядке.

// 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.
}

Проблема, с которой я столкнулся, заключается в следующем:

[Microsoft] [Собственный клиент SQL Server 10.0] [SQL Server] Новая транзакция не разрешена, поскольку существуют другие потоки.работает в сеансе

Я использую драйвер SQLSRV ver.2.
Для чего эта ошибка?Как я могу это решить?

Я включил свой собственный класс sqlsrv в первую часть index.php, содержащую следующие методы:

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);
}

Ответы [ 2 ]

1 голос
/ 29 февраля 2012

Я думаю, вам следует установить MultipleActiveResultSets на true, если вы хотите подключиться к серверу 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

0 голосов
/ 03 марта 2012

По вашей ошибке $nextQuery = sqlsrv_query($stmt2); начинает новую транзакцию в том же сеансе.Можете ли вы совершить !$firstQuery перед началом второго?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...