mysql存储过程中的事务

e37o9pze  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(437)

我尝试在mysql存储过程中使用事务。
具体来说,使用临时记录中的修改数据更新用户表。从另一张table。一旦转移,删除临时记录。
我创建了下面的代码,执行时返回字符串“transaction has successed”。
但是,实际上不会更新任何内容,也不会删除临时记录。
这两个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;

选择响应;
结束

pwuypxnk

pwuypxnk1#

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

update user join updateUserNamesAndNumbers on updateUserNamesAndNumbers.uuid = transferCode
nuypyhwy

nuypyhwy2#

我已经部分回答了我自己的问题。
感谢p.salmon查询transfercode变量。
原来我已经将字符串定义为varchar(24),但是输入实际上比这个大。
所以一旦我把它分类,代码就起作用了,但只是第一次。
我仍然需要好好考虑一下这个问题,因为对同一个例程的第二次调用使用相同的transfercode输入,其中临时元组已经被第一次调用删除,不会抛出mysql异常,正如我所认为的那样。所以“它还在思考时间上限”

相关问题