使用 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);