2016-03-15 1 views
1

En utilisant PHP et PDO, nous nous connectons à un serveur Microsoft SQL. Certaines de nos connexions que nous voulons exécuter en tant que LIRE UNCOMMITTED.PHP PDO sqlsrv pour SQL Server ne pas entrer READ UNCOMMITTED

Je fais la plupart de mon travail de développement sur un Mac et le test/déploiement sur une boîte Windows. J'ai trouvé que l'utilisation de dblib (FreeTDS) sur Mac ou Linux en entrant READ UNCOMMITTED fonctionne comme prévu, mais sous Windows en utilisant sqlsrv (le pilote MS officiel), ce n'est pas le cas.

Voici un script simple que j'ai écrit pour le tester.

$pdo = new PDO ("sqlsrv:server=$hostname;database=$dbname",$username,$pw); 


$stmtIsolationLevel = $pdo->prepare(
"SELECT CASE transaction_isolation_level 
WHEN 1 THEN 'ReadUncommitted' 
WHEN 2 THEN 'ReadCommitted' 
END AS TRANSACTION_ISOLATION_LEVEL 
FROM sys.dm_exec_sessions 
where session_id = @@SPID" 
); 

$stmtSetUncommitted = $pdo->prepare("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED"); 

//output transaction level 
$stmtIsolationLevel->execute(); 
$results = $stmtIsolationLevel->fetchAll(PDO::FETCH_ASSOC); 
echo $results[0]['TRANSACTION_ISOLATION_LEVEL'] . "\n"; 

//set to READ UNCOMMITTED" 
$stmtSetUncommitted->execute(); 
$results = $stmtSetUncommitted->fetchAll(PDO::FETCH_ASSOC); 

//output transaction level 
$stmtIsolationLevel->execute(); 
$results = $stmtIsolationLevel->fetchAll(PDO::FETCH_ASSOC); 
echo $results[0]['TRANSACTION_ISOLATION_LEVEL'] . "\n"; 

sur Mac ou Linux cette sortie: READCOMMITTED READUNCOMMITTED

Sous Windows: READCOMMITTED READCOMMITTED

Remarques: La chaîne de connexion est différent, sur un Mac, il serait « dblib : host = $ hostname; dbname = $ nombase "

J'ai essayé d'inclure l'instruction de transaction set dans le même déclaration où je teste ce que c'est réglé et j'obtiens le même résultat.

J'ai également essayé de définir READ UNCOMMITTED au moment de la connexion en utilisant l'indicateur de constante pour PDO :: SQLSRV mais qui lève une exception impaire.

$pdo = new PDO ("sqlsrv:server=$hostname;database=$dbname",$username,$pw,[PDO::SQLSRV_TXN_READ_UNCOMMITTED]); 

Il en résulte un PDOException: "Le mode de validation automatique ne peut pas être changé pour ce pilote"

+0

Quelle version de MS SQL utilisez-vous ? Et quelle est la version du pilote? Et la version PHP? Pour récupérer une valeur de l'attribut de validation automatique pour votre connexion, essayez: 'echo $ pdo-> getAttribute (constante (" PDO :: ATTR_AUTOCOMMIT "));' – gofr1

+0

Question intéressante. Je jouais avec votre code et la seule façon, quand cela fonctionnait comme vous le vouliez, était d'appeler '$ pdo-> exec (" SET TRANSACTION ISOLATION NIVEAU LIRE UNCOMMITTED ");' à la place de l'instruction préparée. '$ pdo-> query()' ne fonctionnait pas non plus. Vous pouvez également modifier le niveau d'isolation lorsque vous créez une instance PDO. Ce chemin est décrit dans le doc. – kba

+0

Cela fonctionne, en sautant préparé le fait. Étrange. J'ai essayé de le paramétrer à la création comme vous pouvez le voir dans ma modification d'il y a quelques jours, cela provoque une exception. – Sean256

Répondre

0

Vous devez définir la façon suivante:

$isolationLevel = PDO::SQLSRV_TXN_READ_UNCOMMITTED; 

$pdo = new PDO("sqlsrv:server=$hostname;database=$dbname; TransactionIsolation=".$isolationLevel, $username,$pw);