MySQL之事務

  事務用於將某些操做的多個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表中數據庫

相關文章
相關標籤/搜索