码迷,mamicode.com
首页 > 其他好文 > 详细

21-事务

时间:2018-06-15 00:01:38      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:set   原子性   name   原子操作   from   rom   and   一个   val   

事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性。

 

举例说明:

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 user set balance=900 where name=wsb; #买支付100元
update user set balance=1010 where name=egon; #中介拿走10元
update user set balance=1090 where name=ysb; #卖家拿到90元
commit;

#出现异常,回滚到初始状态
start transaction;
update user set balance=900 where name=wsb; #买支付100元
update user set balance=1010 where name=egon; #中介拿走10元
uppdate user 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)

 

下面是操作:当p_return_code为1时,表示异常,立马回滚。当为2时,出现警告,立马回滚原始状态。0表示成功

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;

 

21-事务

标签:set   原子性   name   原子操作   from   rom   and   一个   val   

原文地址:https://www.cnblogs.com/majj/p/9185441.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!