【问题标题】:Is it possible to have mysql transaction without procedure?是否可以在没有程序的情况下进行 mysql 事务?
【发布时间】:2016-10-12 07:43:09
【问题描述】:

问题是写一个事务语句来更新一个数据库列。它可以在可以使用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 ;

最好的问候,

【问题讨论】:

  • 当然,如果你说你不想使用存储过程,那就不要。查看以包装它的编程语言返回的错误代码
  • 感谢回复,我在mysql workbench中运行上面的代码。问题是 DECLARE 和 IF 是特定于存储程序的。我想我可以使用 IF() 函数而不是 IF 语句和 SET 而不是第一个 DECLARE。但是处理程序呢?
  • workbench 类似于 mysql 命令行工具界面。正如你所说,有一大堆构造仅适用于存储程序
  • 如你所说但是,要求是没有程序。 ...所以很难知道你想从某人那里得到什么

标签: mysql stored-procedures transactions


【解决方案1】:

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

我们可以在执行 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 2014-10-23
    • 2017-07-01
    • 2012-02-23
    • 2021-07-07
    • 1970-01-01
    • 2014-05-12
    相关资源
    最近更新 更多