MySql存储过程中的事务

时间:2018-10-04 12:27:26

标签: mysql transactions

我正在尝试在MySQL存储过程中使用事务。

具体来说,使用临时记录中的修订数据更新用户表。从另一个表。 然后一旦转移,请删除临时记录。

我已经创建了下面的代码,该代码在执行时返回字符串“交易成功”。

但是,实际上没有任何更新,并且临时记录也没有删除。

两个SQL语句在单独执行时都可以正常工作,第一个执行更新,第二个执行删除。

任何人都可以启发我什么地方错了吗?

BEGIN 

-- set a default response
DECLARE response varchar(48) DEFAULT "the transaction has failed.";


DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN

    ROLLBACK;
    -- set vars

    SET response = "the transaction has failed, you may have already updated the account.";
    select response;

    END;


START TRANSACTION;

    -- we are inserting data, using information from another table

    update user, updateUserNamesAndNumbers

    SET user.firstName   = updateUserNamesAndNumbers.firstName,
        user.lastName    = updateUserNamesAndNumbers.lastName,
        user.landline    = updateUserNamesAndNumbers.landline,
        user.mobile      = updateUserNamesAndNumbers.mobile

    WHERE 

        updateUserNamesAndNumbers.uuid = transferCode

    AND

        updateUserNamesAndNumbers.userId= user.user_id

    ;


-- finally delete the original tuple


DELETE from updateUserNamesAndNumbers

where uuid= transferCode ;


SET response="The transaction has succeeded";

COMMIT;

SELECT响应;

END

2 个答案:

答案 0 :(得分:0)

将隐式联接更改为显式联接

 update user join updateUserNamesAndNumbers on updateUserNamesAndNumbers.uuid = transferCode

答案 1 :(得分:0)

我已经部分回答了自己的问题。

感谢P.Salmon,用于查询transferCode变量。

事实证明,我已将字符串定义为varchar(24),但输入实际上大于该字符串。

所以一旦我对它进行了排序,代码就可以了,但是只有第一次。

我仍然需要对此进行真正的思考,因为第二次调用具有相同transferCode输入的同一例程(其中临时元组已被第一次调用删除)不会引发MySQL Exception,因为我认为应该。因此,“其仍在思考上限”