PHP PDO - ROLLBACK TRANSACTION 请求没有相应的 BEGIN TRANSACTION
PHP PDO - The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION
使用 PHP PDO Dblib 插入 MSSQL 时出现此错误
exit signal Segmentation fault in apache error log
当我检查免费的 tds 日志时,错误是
The ROLLBACK TRANSACTION request has no corresponding 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'
重现错误。但是,当我删除事务语句时,它会抛出正确的错误,即
Error converting data type varchar to float
有趣的是,如果我在语句中指定了错误的列名,beginTransaction() 会正常工作。该事务仅针对此转换错误和抛出信号分段错误错误不工作。
我在 ubuntu 16.04 中使用 PHP 7.0。想知道为什么回滚在所有情况下都能正常工作,例如错误的列名或 table 名称,但在转换情况下却不行。
SQL 服务器出现错误,会自动回滚您的事务,之后尝试回滚是错误的。而不是
$conn->rollback();
尝试执行批处理
if @@trancount>0 rollback;
我不知道 PHP 但也许是这样的:
$conn->prepare("if @@trancount>0 rollback;")->execute();
使用 PHP PDO Dblib 插入 MSSQL 时出现此错误
exit signal Segmentation fault in apache error log
当我检查免费的 tds 日志时,错误是
The ROLLBACK TRANSACTION request has no corresponding 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'
重现错误。但是,当我删除事务语句时,它会抛出正确的错误,即
Error converting data type varchar to float
有趣的是,如果我在语句中指定了错误的列名,beginTransaction() 会正常工作。该事务仅针对此转换错误和抛出信号分段错误错误不工作。
我在 ubuntu 16.04 中使用 PHP 7.0。想知道为什么回滚在所有情况下都能正常工作,例如错误的列名或 table 名称,但在转换情况下却不行。
SQL 服务器出现错误,会自动回滚您的事务,之后尝试回滚是错误的。而不是
$conn->rollback();
尝试执行批处理
if @@trancount>0 rollback;
我不知道 PHP 但也许是这样的:
$conn->prepare("if @@trancount>0 rollback;")->execute();