事物、函数与流程控制...整理中


1.事物

事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性。比如银行账户之间转账,突然出现网络故障!

示例学习

准备表

create table user(
    id int primary key auto_increment,
    name char(32),
    balance int
);

insert into user(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;  

update user set balance=1000;

出现异常,回滚到初试状态

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; --回滚操作,所有的回到初试状态
commit;

mysql> select * from user;
+----+------+---------+
| id | name | balance |
+----+------+---------+
|  1 | wsb  |    1000 |
|  2 | egon |    1000 |
|  3 | ysb  |    1000 |
+----+------+---------+
3 rows in set (0.00 sec)

事物模板介绍

delimiter //
create procedure p4(out status int)
begin
    1.声明,如果出现异常则执行{
        set status = 1;
        roallback;
    }
    开始事物
        事物代码
        commit;
    结束
    
    set status = 2;
end //
delimiter ;

实现

delimiter //
create procedure p5(out p_return_code tinyint)
begin
    declare exit handler for sqlexception
    begin
        -- error
        set p_ruturn_code = 1; -- 执行失败
        rollback;
    end;
    
    declare exit handler fro sqlwarning
    begin
        -- warning
        set p_return_code = 2; -- 执行失败
        rollback;
    end;
    
    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;  
    -- success 
    set p_return_code = 0; -- 执行成功
end //
delimiter ;

执行

#在mysql中调用存储过程
set @res=123;
call p5(@res);
select @res;

#在python中基于pymysql调用存储过程
cursor.callproc('p5',(123,))
print(cursor.fetchall()) #查询select的查询结果

cursor.execute('select @_p5_0;')
print(cursor.fetchall())
posted @ 2018-04-26 22:23  哈哈大圣  阅读(79)  评论(0编辑  收藏  举报