我有一个交易,用循环中的金额减少变量,如果有钱的变量低于0,金额应该返回到交易前的值。在这种情况下,如何在MariaDB中适当地使用回滚?
---修改
我有类似的东西,它不起作用,查看if(budget<0)
中的行,因为如果钱低于0而某些,但不是全部,迭代被制作并保存到temp表,表格显示了它们
BEGIN
DECLARE temppesel text;
DECLARE tempsalary int;
DECLARE budget int DEFAULT cash;
DECLARE done bool DEFAULT false;
DECLARE occ CURSOR FOR (SELECT pesel, pensja FROM pracownicy where zawod=occupation);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;
START TRANSACTION;
DROP TABLE IF EXISTS temp;
CREATE TABLE temp ( Result text );
OPEN occ;
occ : LOOP
FETCH occ INTO temppesel, tempsalary;
SET budget = budget - tempsalary;
IF(done) THEN
LEAVE occ;
END IF;
IF(budget<0) THEN
ROLLBACK;
LEAVE occ;
END IF;
INSERT INTO temp VALUES (concat('********',substr(temppesel,9,3), ', wyplacono'));
END LOOP;
CLOSE occ;
SELECT * FROM temp;
DROP TABLE temp;
COMMIT;
END
答案 0 :(得分:1)
BEGIN;
do some SQL
Loop:
do some SQL
if something is wrong, ROLLBACK and exit the loop and transaction
do some SQL
if something, go back to Loop
do some SQL
COMMIT;
也就是说,让ROLLBACK
撤消所有,因为BEGIN
。
更多强>
现在SP可见了......
temp
是什么引擎?如果它是MyISAM,那么它不会回滚。 SHOW VARIABLES LIKE 'default_storage_engine';
。occ
用于两件不同的事情,这会让读者感到困惑。pracownicy
行的一部分?或者你想要没有行?temp
,并且它们可以相互踩踏。更改为CREATE TEMPORARY TABLE temp ...
temp
。首先测试它的需要,然后(如果需要)只为所有行做一个SELECT
。...
IF ( SELECT SUM(pensja)
FROM pracownicy
where zawod=occupation ) > budget )
答案 1 :(得分:1)
我认为CREATE TABLE
语句导致事务被提交。 Here是导致隐式COMMIT
的命令列表。
如前面提到的链接所述,您可以在START TRANSACTION
和DROP
命令之后移动CREATE
语句,或使用CREATE TEMPORARY TABLE
语法创建临时表:< / p>
CREATE TEMPORARY TABLE temp ( Result text );