0 レビュー
1 回答
php-MySQLiトランザクションはどのように機能しますか?
ええと、複数のユーザーがいると仮定します。
セッションの開始ごとに、 mysqli_connect
が実行されます。したがって、すべてのユーザーはDBへの独自の(?)接続を持っています。
ユーザーの1人が、DBへのアトミッククエリを実行する必要があるアクションを実行しました。 PHPは次のようなことを提案しています
$ db = mysqli_connect(DB_HOST、DB_USER、DB_PASS);
/ * ATOMIC _BEGIN * /
mysqli_autocommit($ db、false);
mysqli_query($ db、 "BLAH1");
mysqli_query($ db、 "BLAH2");
{-コード-6}($ db);
mysqli_autocommit($ db、true);
/ * ATOMIC _END * /
mysqli_close($ db);
わかりました、それはかなり簡単なようです。ただし、
自動コミットの現在の状態を確認するには、SQLコマンド SELECT @@ autocommit を使用します。
autocommit mode
を判別する方法は、SQLコマンドです。mysqli_autocommit
は、特定のユーザーの接続ではなく、DBの状態全体に適用されているようです。したがって、トランザクションは次のようになります$ db = mysqli_connect(DB_HOST、DB_USER、DB_PASS); //これは別のスレッドか何かにあります //別のユーザーが実行 $db2 = mysqli_connect(DB_HOST、DB_USER、DB_PASS); / * ATOMIC _BEGIN * / mysqli_autocommit($ db、false); mysqli_query($ db、 "BLAH1"); //これは別のスレッドか何かにあります //別のユーザーが実行 //オフにしたため、自動コミットされません //ロールバックできます mysqli_query($db2、 "ATOMICの性質とBLAH2(E. G. LOGIN)の結果を破る別のユーザーのクエリ"); mysqli_query($ db、 "BLAH2"); //$dbクエリと$db2クエリの両方をコミットします {-コード-6}($ db); mysqli_autocommit($ db、true); / * ATOMIC _END * / mysqli_close($ db);
これは誤りであり、まったく意味がありません。他のユーザーは、
mysqli_commit
アクションの後でのみログイン/登録します。ユーザー間のアトミックトランザクションや自分の考えの間違いを分離する正しい方法を知りたいです。私の目標は、
ATOMIC
セクションの後に実行される$db2
クエリです。
わからない
0
レビュー
答え :
解決策:
mysqli_autocommit
は現在の$link
にのみ影響し、他の接続に干渉しないようにする必要があります/threads。
$db
と呼ぶものは、実際にはMySQLiリンクリソースです。
わからない
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。