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;
今天掉到這個坑裏了,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
請大牛指點一下!~
事務