事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性。
现实生活中理解列子:
去银行转钱,从一个账户向另一个账户转钱,大体流程,先在一个账户上扣钱,然后再在另一个账户上加钱,但是当在一个账户上扣完钱往另一个账户上加钱的过程中因为某些原因导致系统出问题,间接导致此次赚钱操作失败。
既然失败了,操作不成功,那么两边账户的钱肯定就不会变化,但是这里就有一个问题了,故障是出在一个账户扣完钱之后的,意思就是一个账户上的钱已经被操作了,那在出了问题之后怎么执行操作,让扣完钱的账户上的钱,返回初始状态?
这里就的使用事物,当检测两边操作一旦某个出现错误,即可 回滚 到操作之前的初始状态。
一、mysql事务
delimiter $$ create PROCEDURE p1( 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; DELETE from tb1; insert into tb2(name)values('seven'); COMMIT; -- SUCCESS set p_return_code = 0; END $$ delimiter ;
执行代码:
set @i =0;
call p1(@i);
select @i;
说明:
1、代码中失误的执行是在存储过程内部。START TRANSACTION; 就表示开始执行事务。
2、rollback:就是回滚的意思。回滚操作就会让数据回到操作之前的状态。
3、执行存储过程,传入参数的时候 out 定义的参数, 可以不传,但是如果要传,必须传一个变量,用于接收返回值。其他值会报错。
二、pymysql 事务
pymysql默认就支持事务的。
直接通过 cursor.execute() 执行sql语句,在方法内部就已经默认支持 事务 的操作。