PHP PDO事务SQL Server 2014错误

PHP PDO事务SQL Server 2014错误,php,pdo,transactions,sql-server-2014,Php,Pdo,Transactions,Sql Server 2014,我正在努力使用PDO事务和SQL Server来保存一些发票详细信息: try { $DB->beginTransaction(); $DB->query($SQLBody); $DB->query($SQLHeader); $DB->commit(); } catch(PDOExecption $e) { $DB->rollback(); print "Error!: " . $e->getMessage()

我正在努力使用PDO事务和SQL Server来保存一些发票详细信息:

try
{
    $DB->beginTransaction();
    $DB->query($SQLBody);
    $DB->query($SQLHeader);
    $DB->commit();
}
catch(PDOExecption $e)
{
    $DB->rollback();
    print "Error!: " . $e->getMessage() . "</br>";
}
系统基于Windows Server 2012 R2、SQL Server 2014和php 7.14

try
{
    $DB->beginTransaction();
    $DB->query($SQLBody);
    $DB->query($SQLHeader);
    $DB->commit();
}
catch(PDOExecption $e)
{
    $DB->rollback();
    print "Error!: " . $e->getMessage() . "</br>";
}
问题是,尽管两个查询都被执行,并且我在数据库中找到了记录(因此我假设$DB和SQL查询都可以)

try
{
    $DB->beginTransaction();
    $DB->query($SQLBody);
    $DB->query($SQLHeader);
    $DB->commit();
}
catch(PDOExecption $e)
{
    $DB->rollback();
    print "Error!: " . $e->getMessage() . "</br>";
}
我还安装了最新的驱动程序(5.2):php_pdo_sqlsrv_71_nts_x64.dll

try
{
    $DB->beginTransaction();
    $DB->query($SQLBody);
    $DB->query($SQLHeader);
    $DB->commit();
}
catch(PDOExecption $e)
{
    $DB->rollback();
    print "Error!: " . $e->getMessage() . "</br>";
}
我总是收到以下回复:

try
{
    $DB->beginTransaction();
    $DB->query($SQLBody);
    $DB->query($SQLHeader);
    $DB->commit();
}
catch(PDOExecption $e)
{
    $DB->rollback();
    print "Error!: " . $e->getMessage() . "</br>";
}
致命错误:未捕获PDO异常:第191行中没有活动事务

try
{
    $DB->beginTransaction();
    $DB->query($SQLBody);
    $DB->query($SQLHeader);
    $DB->commit();
}
catch(PDOExecption $e)
{
    $DB->rollback();
    print "Error!: " . $e->getMessage() . "</br>";
}
其中第191行包含
$DB->commit()

try
{
    $DB->beginTransaction();
    $DB->query($SQLBody);
    $DB->query($SQLHeader);
    $DB->commit();
}
catch(PDOExecption $e)
{
    $DB->rollback();
    print "Error!: " . $e->getMessage() . "</br>";
}
我尝试了以下三种解决方案:

try
{
    $DB->beginTransaction();
    $IB=$DB->prepare($SQLBody);
    $IH=$DB->prepare($SQLHeader);
    $IB->execute();
    $IH->execute();
    $DB->commit();
}
catch(PDOExecption $e)
{
    $DB->rollback();
    print "Error!: " . $e->getMessage() . "</br>";
}
try
{
    $DB->beginTransaction();
    $DB->query($SQLBody);
    $DB->query($SQLHeader);
    $DB->commit();
}
catch(PDOExecption $e)
{
    $DB->rollback();
    print "Error!: " . $e->getMessage() . "</br>";
}
试试看
{
$DB->beginTransaction();
$IB=$DB->prepare($SQLBody);
$IH=$DB->prepare($SQLHeader);
$IB->execute();
$IH->execute();
$DB->commit();
}
捕获(PDO执行选项$e)
{
$DB->rollback();
打印“错误!:”$e->getMessage()。“
”; }
然后我试了一下:

try
{
    $DB->beginTransaction();
    $DB->query($SQLBody);
    $DB->query($SQLHeader);
    $DB->commit();
}
catch(PDOExecption $e)
{
    $DB->rollback();
    print "Error!: " . $e->getMessage() . "</br>";
}
试试看
{
$DB->beginTransaction();
$DB->query($SQLBody);
$DB->query($SQLHeader);
$DB->commit();
}
捕获(PDO执行选项$e)
{
$DB->rollback();
打印“错误!:”$e->getMessage()。“
”; }
最后,这一发现(虽然对sql server 2017似乎有效)

try
{
    $DB->beginTransaction();
    $DB->query($SQLBody);
    $DB->query($SQLHeader);
    $DB->commit();
}
catch(PDOExecption $e)
{
    $DB->rollback();
    print "Error!: " . $e->getMessage() . "</br>";
}
试试看
{
$DB->beginTransaction();
$IB=$DB->exec($SQLBody);
$IH=$DB->exec($SQLHeader);
$DB->commit();
}
捕获(PDO执行选项$e)
{
$DB->rollback();
打印“错误!:”$e->getMessage()。“
”; }

是否可以提出问题?

是否启用了自动提交?尝试调用
$DB->setAttribute(\PDO::ATTR\u AUTOCOMMIT,false)
before
beginTransaction()
。已尝试,但似乎属性自动提交不适用于sql server
try
{
    $DB->beginTransaction();
    $DB->query($SQLBody);
    $DB->query($SQLHeader);
    $DB->commit();
}
catch(PDOExecption $e)
{
    $DB->rollback();
    print "Error!: " . $e->getMessage() . "</br>";
}