php并发加锁示例(2)

<!--?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; } try { //创建锁(推荐使用MemcacheLock) $lockSystem = new LockSystem(LockSystem::LOCK_TYPE_MEMCACHE); //获取锁 $lockKey = &#39;pay&#39;.$userId; $lockSystem--->getLock($lockKey,8); //取出总额 $total = getUserLeftMoney($userId); //花费大于剩余 if($money > $total) { $ret = false; } else { //余额 $left = $total - $money; //更新余额 $ret = setUserLeftMoney($userId,$left); } //释放锁 $lockSystem->releaseLock($lockKey); } catch (Exception $e) { //释放锁 $lockSystem->releaseLock($lockKey); } } //取出用户的余额 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); } ?>

3.2 锁分析

p操作人:

 获取锁:pay100

 取出用户的余额1000。

 支付后剩余 800 = 1000 - 200。

 更新后账户余额800。

 释放锁:pay100

m操作人:

等待锁:pay100

获取锁:pay100

获取余额:800

支付后剩余500 = 800 - 300。

支付后账户余额500。

释放锁:pay100

两次支付后,余额500。非常完美了解决了并发造成的临界区资源的访问问题。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/5b976a949c3b716d901d2e9c97280749.html