事物、函数与流程控制...整理中
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())