2012-02-29 11 views
5

Pracuję nad aplikacją WWW napisaną w PHP i używam programu SQL Server 2008. Do połączenia z bazą danych użyłem narzędzia SQLSRV firmy Microsoft. W części tej aplikacji muszę korzystać z transakcji SQL. Jak sugeruje Microsoft, zrobiłem to dokładnie na podstawie tego artykułu. Główne procesy w moich kodach postępują zgodnie z następującymi krokami:
1- uruchomienie transakcji sql
2 - wysłanie informacji do plików PHP za pośrednictwem jQuery i sprawdzenie wyniku wysłanego przez JSON
3- powrót do poprzedniego wyniku, jeśli wynik był fałszywy i przejście do następnego zapytanie, czy to prawda.
4- zatwierdzić transakcje, jeśli nie wystąpił błąd i wszystkie wyniki były prawidłowe.Co to jest błąd "Nowa transakcja nie jest dozwolona" w sterowniku PHP i 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. 
} 

Problem mam jest to błąd:

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

Używam v.2 sterownika sqlsrv.
Do czego służy ten błąd? Jak mogę to rozwiązać?

I obejmował moje własne klasy sqlsrv do pierwszej części index.php zawierającej poniższych metod:

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

Kiedy występuje ten błąd: przed lub po "sqlsrv_query ($ stmt1);"? Czy jest możliwe, że masz "sqlsrv_begin_transaction" gdzieś przed tym pseudo-kodem? – JScoobyCed

+0

@JScoobyCed: Nie, musi być w bieżącym miejscu. To nie jest ostrzeżenie. To błąd. Zatrzyma to wszystkie procesy. Żadne z 2 zapytań nie zostanie wykonane. –

+0

Mam na myśli, czy masz inny telefon do "sqlsrv_begin_transaction" przed tym pseudo-kodem, dlatego też skarżyłby się, że inna transakcja już się rozpoczęła. Czy próbowałeś debugowania kodu, abyś mógł stwierdzić, w którym wierszu kodu występuje błąd. – JScoobyCed

Odpowiedz

1

myślę, że należy ustawić MultipleActiveResultSets do true gdy chcesz połączyć się z serwerem 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

Nie rozwiązałem mojego problemu ... –

0

ze swojego błędu, wydaje się $nextQuery = sqlsrv_query($stmt2); jest rozpoczęciem nowego transakcja I w tej samej sesji. Czy możesz popełnić !$firstQuery przed rozpoczęciem drugiego?

+1

Colin, więc do czego służy ta transakcja? Absolutnie Nie. Muszę dokonać transakcji, jeśli wszystkie części procesów mogą odnieść sukces w swoich działaniach. –