PHP PDO sqlsrv for SQL Server not entering READ UNCOMMITTED


PHP PDO sqlsrv for SQL Server not entering READ UNCOMMITTED

使用 PHP 和 PDO,我们连接到Microsoft SQL 服务器。我们的一些连接我们希望以 READ UNCOMMIT 的形式运行。

我的大部分开发工作都在Mac上完成,并在Windows机器上进行测试/部署。我发现在Mac或Linux上使用dblib(FreeTDS)进入READ UNCOMMIT 可以按预期工作,但在使用sqlsrv(官方MS驱动程序)的Windows上却没有。

这是我编写的一个简单的脚本来测试它。

$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";

在 Mac 或 Linux 上,此输出:已提交读取读取未提交

在视窗上:已提交读取已提交读取

笔记:连接字符串不同,在 mac 上它将是"dblib:host=$hostname;dbname=$dbname"

我尝试将 set transaction 语句包含在同一个语句中,在那里我测试了它的设置,我得到了相同的结果。

我还尝试使用 PDO::SQLSRV 的常量标志在连接时设置 READ UNCOMMIT ,但这引发了一个奇怪的异常。

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

这会导致 PDOException:"无法更改此驱动程序的自动提交模式"

您必须按以下方式设置:

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