2009-12-16 5 views
1

За последние пару дней я попытался написать Хранимую процедуру в MySQL, и у меня есть какой-то truble, чтобы заставить ее работать. Надеюсь, что кто-то здесь может дать мне какой-то вклад :)Попытка изучить MySQL и транзакции

Пример, который я отправляю для провайдера членства asp.Net, чтобы создать нового пользователя. Я ожидаю отправить электронную почту и пароль в БД и получить int return, чтобы проверить, что userdeatils был записан в БД.

Я использую MySQL DB 5.1 (я думаю) и записываю SQL в webinterface.

У меня есть 2 вопроса, может кто-то объяснить это тоже :): 1) Я использую DELIMITER, но не знаю, что он делает. 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 ; 

Edit: Сообщение об ошибке я получаю:

1064 - У вас ошибка в ваш синтаксис SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «INT BEGIN SET autocommit = 0; DECLARE return_value INT; 'в строке 4

+0

Возможно, вы захотите написать более значимый заголовок для своего вопроса. –

+0

Какая ошибка? Вам не нужно обматывать одно действие в транзакции, поэтому транзакция в этом случае вообще ничего не делает. –

+0

Изменен заголовок, чтобы лучше описать проблему. – Jorn

ответ

1

Чтобы получить поддержку для транзакций, убедитесь, что вы используете механизм хранения InnoDB, а не MyISAM по умолчанию.

Что касается этого кода, то первым вопросом будет вопрос, почему вы заключаете этот единственный запрос в транзакции? Кроме того, какие ошибки вы видите?

+0

Взгляд InnoDB сейчас, thx. Я только что опубликовал ошибку выше, должен был сделать это с самого начала, извините – Jorn

+0

Thx для информации о механизме БД. Кажется, я получил InnoBD удачи :) – Jorn

1

Разделитель переопределяет, какую последовательность символов вы используете для завершения инструкции sql. Вся процедура создания - это один большой оператор, и вам нужно сообщить MySQL, где он заканчивается чем-то (обычно это «;»). Но поскольку у вас есть куча других утверждений в «театре» (между BEGIN и END) инструкции процедуры создания, которую все нужно закончить, вам нужно переопределить разделитель, чтобы вы не закончили оператор процедуры создания на первый ';'.

Без переосмысления разделителя, MySQL будет думать, что создание оператора процедуры выглядит следующим образом, а затем начать новое заявление:

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

    BEGIN 
    SET autocommit = 0; 

Использования DELIMITER; в конце скрипта изменяет разделитель на ';' и не требуется, хотя это хорошая практика.