php减少mysql请求,PHP/MySQL – 如何防止两个请求*更新

我有一些问题

例如:用户将为他的美元买东西

>查看他的美元余额

从他的账户中扣除美元

>订购 – >订单队列

用户得到他的物品,另一个拿到他的美元

可以说,用户在同一秒(非常快)中发出5个请求。

所以有可能(并发生)5个请求正在运行。

他只有钱只能从1个请求中购买。现在请求

是如此之快,脚本检查他的平衡,但不是那么快,它扣除了

从他的帐户的钱。所以请求会通过两次!

如何解决?

在我开始进程之前,我在mysql中使用LOCK:

> IS_FREE_LOCK – 如果没有,请检查该用户是否有锁 – > 2。

> GET_LOCK – 设置锁

做出订单/交易

> RELEASE_LOCK – 释放锁

但这并不真正有效。还有另一种方式吗?

function lock($id) {

mysql_query("SELECT GET_LOCK('$id', 60) AS 'GetLock'");

}

function is_free($id) {

$query = mysql_query("SELECT IS_FREE_LOCK('$id') AS 'free'");

$row = mysql_fetch_assoc($query);

if($row['free']) {

return true;

} else {

return false;

}

}

function release_lock($id) {

mysql_query("SELECT RELEASE_LOCK('$id')");

}

function account_balance($id) {

$stmt = $db->prepare("SELECT USD FROM bitcoin_user_n WHERE id = ?");

$stmt->execute(array($id));

$row = $stmt->fetch(PDO::FETCH_ASSOC);

return $row['USD'];

}

if(is_free(get_user_id())) {

lock(get_user_id());

if(account_balance(get_user_id()) < str2num($_POST['amount'])) {

echo "error, not enough money";

} else {

$stmt = $db->prepare("UPDATE user SET USD = USD - ? WHERE id = ?");

$stmt->execute(array(str2num($_POST['amount']), get_user_id()));

$stmt = $db->prepare("INSERT INTO offer (user_id, type, price, amount) VALUES (?, ?, ?, ?)");

$stmt->execute(array(get_user_id(), 2, str2num($_POST['amount']), 0));

}

更新

用SELECT … FOR UPDATE测试事务功能

$db->beginTransaction();

$stmt = $db->prepare("SELECT value, id2 FROM test WHERE id = ? FOR UPDATE");

$stmt->execute(array(1));

$row = $stmt->fetch(PDO::FETCH_ASSOC);

if($row['value'] > 1) {

sleep(5);

$stmt = $db->prepare('UPDATE test SET value = value - 5 WHERE id = 1');

$stmt->execute();

$stmt = $db->prepare('UPDATE test SET value = value + 5 WHERE id = 2');

$stmt->execute();

echo "did have enough money";

} else {

echo "no money";

}

$db->commit();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值