PHP PDO - у запроса ROLLBACK TRANSACTION нет соответствующей BEGIN TRANSACTION - PullRequest
0 голосов
/ 08 июня 2018

При вставке в MSSQL с использованием PHP PDO Dblib у меня возникает эта ошибка

сигнал выхода Ошибка сегментации в журнале ошибок 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 () работает отлично, если яукажите неверное имя столбца в выписке.Транзакция не работает только для этой ошибки преобразования и ошибки сброса сегментации сигнала.

Я использую PHP 7.0 в Ubuntu 16.04.Хотите знать, почему откат работает нормально во всех случаях, таких как неправильные имена столбцов или таблиц, но не в случае преобразования.

1 Ответ

0 голосов
/ 08 июня 2018

В SQL Server есть ошибки, которые автоматически откатят вашу транзакцию, и попытка отката после этого будет ошибкой.Вместо

$conn->rollback();

попробуйте выполнить пакет

if @@trancount>0 rollback;

Я не знаю PHP, но возможно что-то вроде:

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