2009-12-16 3 views
1

지난 며칠 동안 나는 MySQL에 저장 프로 시저를 작성하려고 노력했으며 일부는 작동하도록 truble했습니다. 여기 누군가가 내게 어떤 의견을 줄 수 있기를 바랍니다 :)MySQL과 트랜잭션을 배우려고 시도

내가 게시 한 예는 asp.Net 회원 서비스 제공 업체가 새로운 사용자를 만드는 것입니다. DB에 전자 메일과 암호를 보내고 intde return을 얻어 userdeatils가 DB에 기록되었는지 확인합니다.

저는 MySQL DB 5.1을 사용하고 웹 인터페이스에 SQL을 작성합니다.

나는 2 개의 사이드 퀘스트가 있는데, 누군가도 그렇게 설명 할 수 있겠는가 :) : 1) 나는 DELIMITER를 사용하지만, 그것이 무엇을하는지 모른다. 2) 트랜잭션을 작동 시키려면 autocommit = 0으로 설정해야하는지, 아니면 수행해야하는지조차 모르겠다.

나는 IF/ELSE 문을 트랜잭션 대신 사용할 수 있지만 어떻게 작동하는지 알아보기 위해 하나의 트랜잭션으로 IF 및 ELSE 문을 사용할 수 있음을 알고 있습니다.

코드 (나는 나중에 alot을 사용할 것으로 예상) 나는 동작하지 않습니다 :

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; DECLARE return_value INT; 'at line 4

+0

질문에 더 의미있는 제목을 쓸 수 있습니다. –

+0

무엇이 오류입니까? 트랜잭션에서 단일 액션을 래핑 할 필요가 없으므로이 경우 트랜잭션이 전혀 수행하지 않습니다. –

+0

문제를보다 자세히 설명하기 위해 제목을 변경했습니다. – Jorn

답변

1

트랜잭션을 지원하려면 기본 MyISAM이 아닌 InnoDB 스토리지 엔진을 사용해야합니다.

해당 코드 자체에서 가장 먼저 질문 할 것입니다. 왜 트랜잭션에서 단일 쿼리를 래핑합니까? 또한 어떤 오류가 표시됩니까?

+0

InnoDB를 지금 찾으세요, thx. 방금 위 오류를 게시했습니다. 시작부터 미안합니다. – Jorn

+0

DB 엔진에 대한 정보는 Thx입니다. 운이 좋으면 InnoBD를 얻은 것처럼 보입니다 :) – Jorn

1

구분 기호는 SQL 문을 종료하는 데 사용할 문자 시퀀스를 재정의합니다. 전체 작성 프로시 저는 하나의 커다란 성명서이며, MySQL이 무언가로 끝나는 곳 (보통 ';')을 알릴 필요가 있습니다. 그러나 BEGIN과 END 사이의 "body"에 다른 명령문이 많이 있기 때문에 모두 종료해야하는 create procedure 문도 있으므로 구분자를 다시 정의해야합니다. 처음 ';'.

구분 기호를 재정의하지 않고, MySQL은 CREATE PROCEDURE 문 있다는 생각이처럼 보였다 한 다음 새 문 시작 :

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

    BEGIN 
    SET autocommit = 0; 

DELIMITER 사용을; 스크립트 끝에서 구분 기호를 다시 ';'로 변경합니다. 그렇게하는 것이 좋은 습관 일지라도 필요하지 않습니다.