mysql 扣费逻辑 存储过程

来源:互联网 发布:互联网过滤软件 编辑:程序博客网 时间:2024/04/30 22:07
参考博客  http://costlend.com/2016/03/14/dispatch-pay-balance-keep-consistence/

-- 创建 扣费存储过程   行级锁 (关键在于在调用存储过程中,就会涉及到表锁,行锁这一概念:所谓区别:有索引的时候就是行锁,没有索引的时候就是表索。innodb 的行锁是在有索引的情况下,没有索引的表是锁定全表的.)


create procedure account_balance_dec( in_money decimal(8,2), in_id varchar(32), OUT status int )  
BEGIN  

DECLARE from_account_balance decimal(8,2);  

START TRANSACTION;  

SELECT emp_point_usable INTO from_account_balance FROM bus_employee  
    WHERE id = in_id FOR UPDATE;  

IF from_account_balance>=in_money THEN   
    UPDATE bus_employee SET emp_point_usable = emp_point_usable - in_money , update_date = sysdate()  
        WHERE id = in_id;  
    COMMIT;  
    SET status=1;
ELSE   
    ROLLBACK;  
    SET status=0;
END IF;  
END;


-- 调用 存储过程  并返回扣费是否成功
set @status:=0;
CALL account_balance_dec(9001,'40288ae45c7c3b5b015c7c44a5e80011',@status);
select @status as status;


-- 查看 存储过程
show create procedure account_balance_dec;
原创粉丝点击