如何解决事务提交/回滚执行问题
我正在 MySQL 中处理存储过程,但我没有掌握事务和处理程序部分,此时我很困惑为什么我们使用事务和处理程序,原因是它在一个地方工作还有一个地方没有
这是我一直在使用的语法
BEGIN
DECLARE exit handler for sqlexception
begin
rollback;
resignal;
end;
START TRANSACTION;
INSERT INTO ch.new_table(new_table_col1,new_table_col2,new_table_col3)
VALUES(nt1,nt2,nt3);
INSERT INTO ch.new_table2(new_table_col1,new_table_col3)
VALUES(t1,t2,t3);
COMMIT;
END
现在我一直在使用上面粘贴的语法作为存储过程将值插入到 new_table 和 new_table2 中
一旦我执行了它,记录就会被添加到 new_table 和 new_table2 中,它们都有自动递增的 ID,当我添加 1 时,它会被添加到 PK 中,就像一个 AI ID 应该
但是当我将相同的内容应用到我的主脚本时,如果插入中有错误,那么它会跳过该 ID,例如,如果我为 ID 7 输入了错误的数据类型,它会引发错误并在我更正时插入该 ID它然后再次插入它会插入一个 8 的 id
所以我自然而然地检查了为什么 Synatx 脚本工作正常,它在没有回滚处理程序的情况下工作正常,并且事务和提交也从中删除
同样的事情与我的主表相反,即使我包含回滚处理程序或事务提交块也不起作用
PROCEDURE `IU_SCD`(_Order_ID int,_Customer_id int,_Receipt_no int,_Date_of_pay date,_Cheque_no int,_Amount int,_SC_Bank varchar(65),_Mode_of_pay varchar(45) )
BEGIN
DECLARE exit handler for sqlexception
begin
rollback;
resignal;
end;
START TRANSACTION;
IF _Order_ID = 0 THEN
INSERT INTO ch03.Order_details( Customer_id,Receipt_no,Date_of_pay,Cheque_no,Amount,SC_Bank)
VALUE (_Customer_id,_Receipt_no,_Date_of_pay,_Cheque_no,_Amount,_SC_Bank);
SELECT last_insert_id() INTO @SCDLID;
#____insert or update in Mode_of_pay table____________________________________________________________________
BEGIN
SELECT MOP_id FROM ch03.mop
WHERE Mode_of_pay = _Mode_of_pay
INTO @SCD_MOP_id;
BEGIN
IF (@SCD_MOP_id IS NULL) THEN
INSERT INTO ch03.mop (Mode_of_pay)
VALUES (_Mode_of_pay);
SELECT last_insert_id() INTO @SCD_MOP_id ;
UPDATE ch03.Order_details SET SCD_MOP_id = @SCD_MOP_id
WHERE Order_ID = @SCDLID;
ELSE UPDATE ch03.Order_details
SET
SCD_MOP_id = @SCD_MOP_id
WHERE Order_ID = @SCDLID;
END IF;
END;
END;
#___________________________________________________________________________________________________________
ELSE UPDATE ch03.Order_details
SET Receipt_no = _Receipt_no,Date_of_pay = _Date_of_pay,Cheque_no = _Cheque_no,Amount = _Amount,SC_Bank = _SC_Bank;
#____insert or update in Mode_of_pay table____________________________________________________________________
BEGIN
SELECT MOP_id FROM ch03.mop
WHERE Mode_of_pay = _Mode_of_pay
INTO @SCD_MOP_id;
BEGIN
IF (@SCD_MOP_id IS NULL) THEN
INSERT INTO ch03.mop (Mode_of_pay)
VALUES (_Mode_of_pay);
SELECT last_insert_id() INTO @SCD_MOP_id ;
UPDATE ch03.Order_details SET SCD_MOP_id = @SCD_MOP_id
WHERE Order_ID = _Order_ID;
ELSE UPDATE ch03.Order_details
SET
SCD_MOP_id = @SCD_MOP_id
WHERE Order_ID = _Order_ID;
END IF;
END;
END;
#___________________________________________________________________________________________________________
END IF;
COMMIT;
END
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。