私はいくつかの質問... 例があります。ユーザーは自分のUSDPHP/MySQLの - 2つの要求を防ぐために、どのように*更新
- のために何かを購入する彼のUSDバランス
- が彼からUSDを控除チェックアカウント
- 注文ください - 、>オーダーキュー
- ユーザーが自分のアイテムを取得し、他の一つは、彼USD
が言うことができます取得ユーザーは同じ秒で5つのリクエストを行います(非常に速い)。 5つのリクエストが実行されている可能性があります(起こります)。 彼は1つのリクエストからしか買うことができません。今度は というリクエストは非常に速く、スクリプトは残高を確認しますが、それほど速くはないので、自分のアカウントからお金を差し引くことになります。したがって、リクエストは2回に渡ります! それを解決するには?私は、プロセスを開始する前に、私は、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));
}
更新 は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();
[**新しいコード**]でmysql_ *関数を使用しないでください(http://bit.ly/phpmsql)。彼らはもはや維持されておらず(正式に非難されている)(http://j.mp/XqV7Lp)。 [** red box **](http://j.mp/Te9zIL)を参照してください。代わりに[* prepared statements *](http://j.mp/T9hLWi)について学び、[PDO](http://php.net/pdo)または[MySQLi](http://php.net/ mysqli) - [この記事では、(http://j.mp/QEx8IB)はあなたがどちらを決定するのに役立ちます。 – Kermit
誰かがこれが何を意味するかを知っている: "ユーザーは彼のアイテムになり、もう1人は彼のUSDになる"?彼らは「つくられる」より「つかむ」という意味ですか? – ESRogs
取引についても*基本*を知らなくても、オンライン取引サイトを操作することは可能ですか? – Massimo