mysql存儲過程包含事物的處理

mysql存儲過程,包含:事物、in/out mysql

DROP PROCEDURE proc_user_register;
DELIMITER $$
CREATE
    PROCEDURE `proc_user_register`(IN uname VARCHAR(18),IN upsd VARCHAR(32),IN eml VARCHAR(32),IN cd BIGINT ,OUT msg VARCHAR(30))
    BEGIN
    /** 標記是否出錯 */  
    DECLARE t_error INT DEFAULT 0;  
    /** 若是出現sql異常,則將t_error設置爲1後繼續執行後面的操做 */  
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1; -- 出錯處理  
    /** 顯式的開啓事務,它開啓後,事務會暫時中止自動提交*/  
    -- start transaction;  
    /** 關閉事務的自動提交 */  
    SET autocommit = 0;      
        
    INSERT INTO user_login(user_name,user_psd,email,cdt) VALUES(uname,upsd,eml,cd);
    SET @id =  LAST_INSERT_ID();
    INSERT INTO user_info (user_id ) VALUES (@id);
    INSERT INTO user_credit_money(user_id) VALUES (@id);
    INSERT INTO user_activity_count(user_id) VALUES (@id);
    /** 標記被改變,表示事務應該回滾 */  
    IF t_error=1 THEN  
        ROLLBACK; -- 事務回滾  
        SET msg='error';
    ELSE  
        COMMIT; -- 事務提交  
        SET msg='success';
    END IF;  
    SET autocommit =1;  
    END$$
DELIMITER ;

使用:
CALL proc_user_register ('aaa','e2e2','aaa@q1.com',14874784,@msg);SELECT @msg;



又搜了一下,發現:SET autocommit = 0;  使用須要注意 使用完了,恢復、原文以下:
今天掉到這個坑裏了,mysql若是開了set autocommit=0,那麼全部的語句必定是在一個事務裏,在這種狀況下,若是使用鏈接池,而且在查詢以前沒有rollback或者set autocommit=1,那麼你就杯具了。由於根據mysql的默認事務級別,一致性讀,你永遠也取不到這個事務被開戶前的數據。另一點set autocommit= 0,會自動提交前一個事務,所以正確的做法是rollback, set autocommit =0,完成以後再set autocommit = 1;
具體連接:http://blog.csdn.net/hopingwhite/article/details/5850461

不明白的地方,是 SET autocommit =1;   應該放在哪一個地方。求解!~ sql

寫了個存儲過程,翻看了你們對:http://www.oschina.net/question/121073_32981 的各類評論,我對這個存儲過程把握也不是很大,並且還有2個疑問: .net

(1) SET @id =  LAST_INSERT_ID(); 可否可使用; code

(2)SET autocommit =1; 
放置的位置究竟在哪裏? blog

請大牛指點一下!~
事務

相關文章
相關標籤/搜索