PHP PDO - 回滚事务请求没有相应的 BEGIN 事务



在使用PHP PDO Dblib插入MSSQL时,我遇到了此错误

退出信号 Apache 错误日志中的分段错误

当我检查免费的tds日志时,错误是

回滚事务请求没有相应的开始事务

但是,这仅在特定情况下发生,即当我有浮点数据类型的字符串时。下面是我的代码:

$conn = new PDO('dblib:host=hostname;dbname=mydbname', 'user', 'password');
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$conn->beginTransaction();
$query = 'INSERT INTO [TestTable] ([RecordNo], [Paymode], [VATVALUE])
VALUES (:RecordNo, :Paymode, :VATVALUE)';
$stmt = $conn->prepare($query);
try {
$stmt->execute( [":VATVALUE" => "158.4'", ":Paymode" => "CREDIT", 
":RecordNo" => "ABC-312735"] );
$conn->commit();
} catch(PDOException $e) {
$conn->rollback();
}

请注意我已将其设置为

158.4'

用于复制错误。但是,当我删除交易语句时,它会抛出正确的错误,即

将数据类型 varchar 转换为浮点数时出错

有趣的是,如果我在语句中指定了错误的列名,beginTransaction(( 将正常工作。该事务不仅适用于此转换错误和抛出信号分割错误错误。

我在 ubuntu 16.04 中使用 PHP 7.0。想知道为什么回滚在所有情况下都能正常工作,例如错误的列名或表名,但在转换情况下却不行。

SQL Server 中存在错误,这些错误将自动回滚您的事务,之后尝试回滚是错误的。 而不是

$conn->rollback();

尝试执行批处理

if @@trancount>0 rollback;

我不懂PHP,但也许是这样的:

$conn->prepare("if @@trancount>0 rollback;")->execute();

相关内容

最新更新