本文介绍了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