我正在使用存储过程在Mysql DB
DELIMITER $$
CREATE PROCEDURE `transaction_sp` ()
BEGIN
DECLARE exit handler for sqlexception
BEGIN
-- ERROR
ROLLBACK;
END;
DECLARE exit handler for sqlwarning
BEGIN
-- WARNING
ROLLBACK;
END;
START TRANSACTION;
INSERT INTO table_name (id, name, address) values ('1','Test','xpert.com');
SET @LID = LAST_INSERT_ID();
INSERT INTO table_name3 (id, job, responsibilities) values
(@LID,'Sr. Developer','Coding,mentoring etc');
COMMIT;
END
$$
现在,我希望如果第二个INSERT语句失败,则第二个SQL语句不会执行,第一个Insert将被回滚。
通过上述方法,第一笔交易不会回滚。我需要设置任何标志吗?
如何处理?解释得很好的答案在这里会有所帮助。
答案 0 :(得分:0)
请参阅下面的答案。我相信如果您在每次插入后检查@@ROWCOUNT
或@@Error
,则可以在没有受影响的行时回滚。对不起,如果我使用的方法是错误的。
DELIMITER $$
CREATE PROCEDURE `transaction_sp` ()
BEGIN
DECLARE @nRowCount1 int,
@nRowCount2 int
DECLARE exit handler for sqlexception
BEGIN
-- ERROR
ROLLBACK;
END;
DECLARE exit handler for sqlwarning
BEGIN
-- WARNING
ROLLBACK;
END;
START TRANSACTION;
INSERT INTO table_name (id, name, address) values ('1','Test','xpert.com');
SET @LID = LAST_INSERT_ID();
SET @nRowCount1 = @@ROWCOUNT ;
INSERT INTO table_name3 (id, job, responsibilities) values
(@LID,'Sr. Developer','Coding,mentoring etc');
SET @nRowCount2 =@@ROWCOUNT
if(@nRowCount1 <=0 and @nRowCount2<=0)
begin
ROLLBACK ;
end
COMMIT;
END
$$