mysql - 是否可以不用程序进行mysql事务?

标签 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 ;

最诚挚的问候,

最佳答案

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

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

关于mysql - 是否可以不用程序进行mysql事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39993129/

相关文章:

mysql - 删除表列(如果存在)(SQLSTATE[42000] 语法错误或访问冲突)

mysql - 如何恢复 phpmyadmin 密码

ios - ASP.NET存储过程调用将VarBinary插入sql

c# - ado.net transaction.commit 抛出信号量异常

根据最高击杀次数对 PHP 表用户进行排名

mysql - 获取所有用户首次访问日期

java - 在 Oracle 上调用存储过程抛出 ORA-06550 异常

mysql - 如何从具有可变数据库和表的数据中进行选择

java - 与数据源手动交互后回滚测试中的更改?

svn - 如何检索 svn 事务 ID