mysql - 尝试学习 MySQL 和事务

标签 mysql stored-procedures transactions

在过去的几天里,我试图在 MySQL 中编写一个存储过程,但在让它工作时遇到了一些麻烦。希望这里有人可以给我一些意见:)

我发布的示例是为 asp.Net 成员(member)提供程序创建一个新用户。我希望将电子邮件和密码发送到数据库并获得一个 int 返回值以验证 userdeatils 是否已写入数据库。

我使用 MySQL DB 5.1(我认为)并将 SQL 写入 Web 界面。

我有 2 个附带问题,有人也可以解释一下吗:) 1) 我使用分隔符,但不知道它的作用。 2)我不确定我是否必须做其他事情然后设置 autocommit = 0 以使事务工作,或者我是否必须这样做。

我知道我可以使用 IF/ELSE 语句而不是事务,但我想用一个语句来做,以了解它是如何工作的。 (我希望以后经常使用它)

我无法开始工作的代码:

DELIMITER //

CREATE DEFINER=`websharp_dk`@`%` PROCEDURE `CreateUser`(
    IN _username VARCHAR(100),
    IN _Password VARCHAR(100))
    RETURNS INT

    BEGIN
    SET autocommit = 0;
    DECLARE return_value INT;

    BEGIN TRY
        START TRANSACTION
                INSERT INTO User 
                (Email
                ,Password
                ,Failed_Password_Count
                ,Creation_Date)
                VALUES
                (_username
                ,_Password
                ,0
                ,Datetime.Now())
            SET return_value = 1;
        COMMIT;
    END TRY

    BEGIN CATCH
        ROLLBACK
        SET return_value = 0;
    END CATCH

    BEGIN FINALLY
    RETURN return_value;
    END FINALLY 
    END//
DELIMITER ;

编辑: 我收到的错误消息是:

1064 - 您的 SQL 语法有误;检查与您的 MySQL 服务器版本对应的手册,了解在 'INT BEGIN SET autocommit = 0; 附近使用的正确语法。声明返回值 INT; ' 在第 4 行

最佳答案

要获得对事务的支持,请确保您使用的是 InnoDB 存储引擎而不是默认的 MyISAM。

就代码本身而言,我的第一个问题是,为什么要将单个查询包装在事务中?另外,您看到了什么错误?

关于mysql - 尝试学习 MySQL 和事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1913285/

相关文章:

php - 将选定的维基百科文章复制到自己的维基?

特定年份存储过程中的mysql总和计算

c# - 数据库查询中的存储过程与代码

php - 使用事务锁定表,在同一事务中删除然后插入

mongodb - 为什么MongoDB没有事务? (v4.0 之前)

php - 将 foreach 与 mysqli_fetch_assoc 结合使用

mysql - 如何访问 Kubernetes 中的复制数据库?

php - 在类声明中使用外部对象 - PHP

Mysql 存储过程未产生预期结果

php - 存储过程和包装它的 php 代码上的双重事务