php并发加锁以支付为例

       本文介绍了php并发加锁示例,对数据进行加锁,只容许一个用户在一个时间内进行操作,这个时候就需要用到锁了,需要的朋友可以了解一下。

       在工作项目中,会遇到一些php并发访问去修改一个数据问题,如果这个数据不加锁,就会造成数据的错误。下面我将分析一个财务支付锁的问题。希望对大家有所帮助。

1 没有应用锁机制

1.1 财务支付简化版本代码

<?php 
/** 
 * pay.php 
 * 
 * 支付没有应用锁
 * 
 * Copy right (c) 2016 
 * 
 * modification history: 
 * -------------------- 
 * 2016/9/10, by CleverCode, Create 
 * 
 */
//用户支付
function pay($userId,$money)
{  
     if(false == is_int($userId) || false == is_int($money))
     {
          return false;
     }   
     //取出总额
    $total = getUserLeftMoney($userId);   
     //花费大于剩余
     if($money --> $total)
     {
         return false; 
    }
    //余额
    $left = $total - $money;
    //更新余额
    return setUserLeftMoney($userId,$left);
}
//取出用户的余额
function getUserLeftMoney($userId)
{
    if(false == is_int($userId))
    {
        return 0;
    }
    $sql = "select account form user_account where userid = ${userId}";
    //$mysql = new mysql();//mysql数据库
    return $mysql->query($sql);
}
//更新用户余额
function setUserLeftMoney($userId,$money)
{
    if(false == is_int($userId) || false == is_int($money))
    {
        return false;
    }  
    $sql = "update user_account set account = ${money} where userid = ${userId}";
    //$mysql = new mysql();//mysql数据库
    return $mysql->execute($sql);
}
?>

 1.2 问题分析

如果有两个操作人(p和m),都用用户编号100账户,分别在pc和手机端同时登陆,100账户总余额有1000,p操作人花200,m操作人花300。并发过程如下。

p操作人:

  1. 取出用户的余额1
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值