Попытка выучить MySQL и транзакции
-
19-09-2019 - |
Вопрос
За последние пару дней я пытался написать хранимую процедуру в MySQL, и у меня есть немного опасных, чтобы она работала. Надеюсь, кто -то здесь сможет внести мне вклад :)
Пример, который я публикую, для поставщика членства ASP.NET для создания нового пользователя. Я рассчитываю отправить электронную почту и пароль в БД и получить возврат int, чтобы убедиться, что userDeatils был записан в БД.
Я использую MySQL DB 5.1 (я думаю) и пишу SQL на веб -интерфейс.
Я получил 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 Server для правильного синтаксиса для использования вблизи int begin set autocommit = 0; Объявить return_value int; 'В строке 4
Нет правильного решения
Другие советы
Чтобы получить поддержку транзакций, убедитесь, что вы используете механизм хранения InnoDB, а не Myisam по умолчанию.
Что касается самого этого кода, то мой первый вопрос был бы, почему вы завершаете этот единственный запрос в транзакции? Кроме того, какие ошибки вы видите?
Разделитель переосмысливает, какую последовательность символов вы используете для завершения оператора SQL. Вся процедура создания - это одно большое утверждение, и вам нужно сказать MySQL, где это заканчивается чем -то (обычно будет ';'). Но поскольку у вас есть куча других утверждений в «теле» (между началом и конец) оператора создания процедуры, которое все необходимо закончить, вам нужно переопределить разделитель, чтобы вы не заканчивали оператор «Создать процедуру» в первый ';'.
Без переопределения разделителя MySQL подумает, что утверждение процедуры создания выглядит так, а затем начнете новое утверждение:
CREATE DEFINER=`websharp_dk`@`%` PROCEDURE `CreateUser`(
IN _username VARCHAR(100),
IN _Password VARCHAR(100))
RETURNS INT
BEGIN
SET autocommit = 0;
Используя разделитель; В конце сценария изменяет разделитель обратно на ';' и это не нужно, хотя это хорошая практика для этого.