PHP PDO - ROLLBACK TRANSACTION请求没有相应的BEGIN TRANSACTION

时间:2018-06-08 17:59:40

标签: sql-server php transactions freetds

使用PHP PDO Dblib插入MSSQL时出现此错误

  

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

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

  

ROLLBACK TRANSACTION请求没有相应的BEGIN TRANSACTION

然而,这只发生在特定情况下,即我有一个浮点数据类型的字符串。以下是我的代码:

$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转换为float

时出错

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

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

1 个答案:

答案 0 :(得分:4)

SQL Server中存在错误会自动回滚您的事务,并且在此之后尝试回滚是错误的。而不是

$conn->rollback();

尝试执行批处理

if @@trancount>0 rollback;

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

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