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);
}
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
@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. –
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