Tentando aprender MySQL e transações
-
19-09-2019 - |
Pergunta
Nos últimos dias, tentei escrever um procedimento armazenado no MySQL e tenho alguns trufos fazendo com que funcione. Espero que alguém aqui possa me dar alguma contribuição :)
O exemplo que eu publico é para o fornecedor de associação do ASP.NET criar um novo usuário. Espero enviar e -mail e senha para o banco de dados e obter um retorno int para verificar se o UserDeatils foi gravado no banco de dados.
Eu uso um MySQL DB 5.1 (eu acho) e escrevo o SQL em uma WebInterface.
Eu tenho 2 perguntas laterais, alguém também pode explicar isso :): 1) Uso um delimitador, mas não sei o que faz. 2) Não tenho certeza se tenho que fazer outras coisas para definir o AutoCommit = 0 para fazer com que as transações funcionem ou se eu tenho que fazer isso.
Sei que poderia ter usado uma instrução IF / else em vez de uma transação, mas gostaria de fazê -lo com uma para descobrir como ela funciona. (Espero usá -lo muito mais tarde)
O código que não consigo trabalhar:
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 ;
Editar: a mensagem de erro que recebo é:
1064 - Você tem um erro na sua sintaxe SQL; Verifique o manual que corresponde à sua versão do MySQL Server para obter a sintaxe correta para usar perto de 'int Begin Set AutoCommit = 0; Declarar return_value int; 'Na linha 4
Nenhuma solução correta
Outras dicas
Para obter suporte para transações, verifique se você está usando o mecanismo de armazenamento Innodb e não o Myisam padrão.
Quanto a esse código em si, minha primeira pergunta seria: por que você está envolvendo essa consulta única em uma transação? Além disso, que erros você está vendo?
O delimitador redefine qual sequência de caracteres você usa para encerrar uma instrução SQL. Todo o procedimento de criação é uma grande declaração e você precisa dizer ao MySQL onde termina com alguma coisa (normalmente seria ';'). Mas como você tem várias outras declarações no "corpo" (entre o início e o fim) da declaração de procedimento de criação de que todos precisam ser encerrados também, é necessário redefinir o delimitador para não encerrar a declaração de procedimento de criação no The the primeiro ';'.
Sem redefinir o delimitador, o MySQL pensaria que a declaração de procedimento de criação parecia assim e depois inicia uma nova declaração:
CREATE DEFINER=`websharp_dk`@`%` PROCEDURE `CreateUser`(
IN _username VARCHAR(100),
IN _Password VARCHAR(100))
RETURNS INT
BEGIN
SET autocommit = 0;
Usando delimiter; No final do script muda o delimitador de volta para ';' e não é necessário, embora seja uma boa prática fazê -lo.