php并发加锁问题阐明与设计代码实例讲授(2)

<!--?php /** * pay.php * * 付出应用锁 * * Copy right (c) 2018 * * modification history: * -------------------- * 2018/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 = 'pay'.$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操纵人:

1、期待锁:pay100
2、获取锁:pay100
3、获取余额:800
3、付出后剩余500 = 800 - 300。
5、付出后账户余额500。
6、释放锁:pay100

两次付出后,余额500。很是完美了办理了并发造成的临界区资源的会见问题。

到此这篇关于php并发加锁问题阐明与设计代码实例讲授的文章就先容到这了,更多相关php并发加锁问题阐明与设计内容请搜索剧本之家以前的文章或继承欣赏下面的相关文章但愿各人今后多多支持剧本之家!

您大概感乐趣的文章:

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

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