Uncaught исключение 'PDOException' с сообщением «Нет активной транзакции»? - PullRequest
4 голосов
/ 23 февраля 2012

Это код, который я использую для вставки записи. Всякий раз, когда возникает ошибка вставки, число авто-inc таблицы подписчиков все равно будет увеличиваться, даже если я откатился? В чем проблема? Я просто хочу, чтобы номер автоматического увеличения не добавлялся при возникновении ошибки . Большое спасибо за помощь.

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE);
$conn->beginTransaction();
try {

    $email = $_POST['Email'];
    $FirstName = $_POST['FirstName'];
    $LastName = $_POST['LastName'];


    $query="INSERT INTO subscriber (Email,FirstName,LastName,CreateDate) VALUES (?,?,?,CURDATE())";
    $stmt = $conn->prepare($query);


    $stmt->bindParam(1, $email , PDO::PARAM_STR);
    $stmt->bindParam(2, $FirstName, PDO::PARAM_STR);
    $stmt->bindParam(3, $LastName, PDO::PARAM_STR);
    $stmt->execute();
    $conn->commit();

}
catch(PDOException $e)
    {
    $conn->rollBack();
    die ($e->getMessage()."<a href='addSub.php'>Back</a>");
    }

$conn->beginTransaction();
try {
    $userID = $_SESSION['username'];
    $query="INSERT INTO list_sub (SubID,ListID) VALUES ('',$_SESSION[ListID])";
    $stmt = $conn->prepare($query);
    $stmt->execute();
    $conn->commit();

}
catch(PDOException $e)
    {
    $conn->rollBack();
    die ($e->getMessage()."<a href='addSub.php'>Back</a>");
    }

$conn = null;}

Ответы [ 2 ]

6 голосов
/ 23 февраля 2012

Не зная номеров строк в вашем коде, трудно знать , но вы фиксируете транзакцию в конце первого блока try-catch, а затем продолжаете, не начиная новую транзакцию во второй попытке.Блок захвата.

Добавьте $conn->beginTransaction(); в начале вашего второго блока try-catch.

РЕДАКТИРОВАТЬ - Вы упоминаете: «Я просто хочу, чтобы номер автоматического увеличения не добавлялся при возникновении ошибки».Вы не должны полагаться на функцию автоинкремента, чтобы генерировать «пустую» последовательность чисел.

5 голосов
/ 23 февраля 2012

Автоматическая фиксация PDO, вероятно, включена, и она вызывает проблему при попытке отката, поскольку она уже зафиксирована.Вы можете использовать PDO :: ATTR_AUTOCOMMIT , чтобы отключить это поведение:

$conn->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...