是否有可能没有程序的mysql事务?

时间:2016-10-12 07:43:10

标签: mysql stored-procedures transactions

问题是编写一个事务语句来更新数据库列。它可以在可以使用DECLAREIF语句的过程中完成。但是,要求不是有程序。这可以实现吗?这是我尝试过的:

DELIMITER $$
CREATE PROCEDURE `sp_updatecolumn`()
BEGIN
    DECLARE `_rollback` BOOL DEFAULT 0;
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `_rollback` = 1;
    START TRANSACTION;
    UPDATE mytable
    SET mycolumn=1
    WHERE mycolumn=2;    
    IF `_rollback` THEN
        ROLLBACK;
    ELSE 
        COMMIT;
    END IF;
END$$
DELIMITER ;

最诚挚的问候,

1 个答案:

答案 0 :(得分:0)

是的,我们可以在没有程序的情况下回滚事务,但是我们无法通过脚本捕获脚本中的错误(以声明处理程序)。

我们可以在执行sql脚本然后rollbak或commit:

后捕获错误
try {
    $pdo->exec("START TRANSACTION;");
    $stmt = $pdo->prepare('INSERT INTO `test` (`id`) VALUES (:id);');
    $stmt->bindValue(':id', $_POST['id']?$_POST['id']:NULL, PDO::PARAM_INT);
    $stmt->execute();
    $pdo->exec("COMMIT;");
} catch (PDOException $e) {
    $pdo->exec("ROLLBACK;");
    die("<p>" . $e->getMessage() . "</p>");
}

我们可以尝试(但它不起作用!!!):

SELECT @error_count := @@error_count;
START TRANSACTION;
INSERT INTO `test` (`id`) VALUES (1);
INSERT INTO `test` (`id`) VALUES (1); -- Error on dupl...
INSERT INTO `test` (`id`) VALUES (3);
-- It is your IF:
SET @sql = (SELECT IF(
    @@session.error_count>@error_count,
    "ROLLBACK;",
    "COMMIT;"
));
PREPARE stmt FROM @sql;
EXECUTE stmt;