问题是编写一个事务语句来更新数据库列。它可以在可以使用DECLARE
和IF
语句的过程中完成。但是,要求不是有程序。这可以实现吗?这是我尝试过的:
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 ;
最诚挚的问候,
答案 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;