事務用於將某些操做的多個SQL做爲原子性操做,一旦有某一個出現錯誤,便可回滾到原來的狀態,從而保證數據庫數據完整性。舉例說明:mysql
create table user2( id int primary key auto_increment, name char(32), balance int ); insert into user2(name,balance) values ('wsb',1000), ('egon',1000), ('ysb',1000); #出現異常,回滾到初始狀態 start transaction; update user2 set balance=900 where name='wsb'; #買支付100元 update user2 set balance=1010 where name='egon'; #中介拿走10元 uppdate user2 set balance=1090 where name='ysb'; #賣家拿到90元,出現異常沒有拿到 rollback; mysql> select * from user; +----+------+---------+ | id | name | balance | +----+------+---------+ | 1 | wsb | 1000 | | 2 | egon | 1000 | | 3 | ysb | 1000 | +----+------+---------+ rows in set (0.00 sec) #原子操做 start transaction; update user2 set balance=900 where name='wsb'; #買支付100元 update user2 set balance=1010 where name='egon'; #中介拿走10元 update user2 set balance=1090 where name='ysb'; #賣家拿到90元 commit;
下面是操做:當ip_return_code爲1時,表示異常,立馬回滾。當爲2時,出現警告,立馬回滾原始狀態。0表示成功sql
delimiter // create PROCEDURE b6( OUT p_return_code tinyint ) BEGIN DECLARE exit handler for sqlexception BEGIN -- ERROR set p_return_code = 1; rollback; END; DECLARE exit handler for sqlwarning BEGIN -- WARNING set p_return_code = 2; rollback; END; START TRANSACTION; insert into blog(name,sub_time) values('yyy',now()); COMMIT; -- SUCCESS set p_return_code = 0; #0表明執行成功 END // delimiter ; set @res=123; call b6(@res); select @res;
select @res時返回0表示成功執行插入。此時,查詢能夠看到yyy已經成功插入blog表中數據庫