MySQLとトランザクションを学ぼうとしています
-
19-09-2019 - |
質問
ここ数日にわたって、私はMySQLにストアドプロシージャを書き込もうとしましたが、それを機能させるためにいくらかの真実の手順があります。ここの誰かが私にいくつかの入力を与えることができることを願っています:)
私が投稿する例は、ASP.NETメンバーシッププロバイダーが新しいユーザーを作成するためのものです。私はDBに電子メールとパスワードを送信し、INTリターンを取得して、userdeatilsがDBに書き込まれたことを確認することを期待しています。
MySQL DB 5.1(私は思う)を使用して、SQLをWebインターフェイスに書き込みます。
私は2つのサイドクエストを得ました、誰かがそれを説明することもできます:):1)私はデリミターを使用しますが、それが何をするかわかりません。 2)トランザクションを取得するためにAutoCommit = 0を設定するために他のことをしなければならないかどうか、またはそれをしなければならないかどうかはわかりません。
私はトランザクションの代わりに / 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構文にエラーがあります。 'int begin set autocommit = 0; return_value intを宣言します。 '4行目
正しい解決策はありません
他のヒント
トランザクションのサポートを得るには、デフォルトのMyISAMではなくInnoDBストレージエンジンを使用していることを確認してください。
そのコード自体に関する限り、私の最初の質問は、なぜあなたはトランザクションでその単一のクエリをラップしているのですか?また、どのようなエラーが表示されますか?
Delimiterは、SQLステートメントを終了するために使用する文字のシーケンスを再定義します。作成手順全体は1つの大きなステートメントであり、mysqlに何かで終わる場所(通常は ';')に伝える必要があります。しかし、すべてが終了する必要があるという作成手順ステートメントの「ボディ」(ボディとエンドの間)に他の声明がたくさんあるので、デリミッターを再定義する必要があるので、最初 ';'。
デリミッターを再定義することなく、MySQLはCREATE PROCEDUREステートメントがこのように見えたと考え、次に新しいステートメントを開始します。
CREATE DEFINER=`websharp_dk`@`%` PROCEDURE `CreateUser`(
IN _username VARCHAR(100),
IN _Password VARCHAR(100))
RETURNS INT
BEGIN
SET autocommit = 0;
Delimiterを使用します。スクリプトの最後に、区切り文字が ';'に戻ります。そして、そうすることは良い習慣ですが、必要ありません。