MySQL はネストされたトランザクションをサポートしていますが、それを実行する人は多くありません... 少し前に、MySQL のネストされたトランザクションの必要性について議論している外国人を見ました。 とても面白いですね。このネストされた奇妙な使用法が必要なシナリオはあるのでしょうか? 元 DBA の同僚と話をしたところ、MySQL のネストされたトランザクションはどのようなシナリオでも使用すべきではないことがわかりました。 では、MySQL のネストされたトランザクションを使用するとどのような問題が発生するのでしょうか? mysql> ceshi から * を選択します。 +------+ | いいえ | +------+ | 1 | +------+ セット内の 1 行 (0.00 秒) mysql> トランザクションを開始します。 クエリは正常、影響を受けた行は 0 行 (0.00 秒) mysql> ceshi 値に挿入します(2); クエリは正常、1 行が影響を受けました (0.00 秒) mysql> トランザクションを開始します。 クエリは正常、影響を受けた行は 0 行 (0.00 秒) mysql> ceshi 値に挿入します(3); クエリは正常、1 行が影響を受けました (0.00 秒) mysql> コミット; クエリは正常、影響を受けた行は 0 行 (0.00 秒) mysql> ロールバック; クエリは正常、影響を受けた行は 0 行 (0.00 秒)
+-----+ | いいえ | +-----+ | 1 | | 2 | | 3 | +-----+ SQL インタープリターがトランザクションの開始を検出すると、コミットがトリガーされます... !!! begin_2 を実行すると、sql_1 はすでにコミットされています。commit_1 を実行すると、sql_2 と sql_3 はすでにコミットされています。この時点で、ロールバックすると無駄になります...すでにコミットされているため、何をロールバックできますか... 前述したように、アーキテクチャではネストされたトランザクションを使用する人はほとんどいませんが、誤ってネストされることもあります。 Python プロジェクトを例に挙げてみましょう。まず、デコレータを使用してトランザクション パッケージを実装します。次に、データ処理関数 def a() と def b() がトランザクションにラップされます。これらはすべて単一のトランザクションであるため、単に a または b を使用するかどうかは問題ではありません。 ロジック内で a が b を呼び出すと、何が起こりますか? はい、トランザクションはネストされています...これはほとんどのビジネス開発者が遭遇する問題だと思います。 では、このリスクを回避するにはどうすればよいでしょうか? ロックすることができます... サブトランザクションを作成する前に、グローバル ロックを設定し、ロック ステータスを確認します... Flask フレームワークを使用している場合は、flask g グローバル変数を使用できます。 Django フレームワークの場合は、スレッドローカルを使用してグローバル変数を使用できます。 tornado や gevent などの非同期 IO アーキテクチャの場合は、fd を使用してコルーチン変数を関連付けることができます。 @デコレータ def with_transaction(f, *args, **kwargs): db = connection.get_db_by_table("*") 試す: db.begin() ret = f(*args, **kwargs) コミット() を除外する: ロールバック() 上げる リターン ret @トランザクションあり def hid(self): '''注文がアプリに表示されません''' self.status が OrderStatus.allow_deletion_statuses() にない場合: OrderStatusChangeNotAllowed(self.status, OrderStatus.deleted) を発生させます。 ... @トランザクションあり def change_receipt_info(自分、住所、名前、電話番号): 地域 = Region.get_by_address(アドレス) ... 次のステートメントを実行すると、トランザクションは強制的にコミットされます。もちろん、ここでの前提は autocommit = True です。 関数の変更 手順の変更 テーブルの変更 始める データベースの作成 関数を作成する インデックスの作成 手順の作成 テーブルの作成 データベースの削除 ドロップ機能 インデックスを削除 ドロップ手順 テーブルを削除 テーブルのロックを解除 マスターデータをロード ロックテーブル テーブル名の変更 テーブルを切り捨てる AUTOCOMMIT=1 を設定します 取引を開始 以下もご興味があるかもしれません:
|
<<: Vueのv-onパラメータの問題についてお話しましょう
>>: Eclipse/Tomcat でホットデプロイメントとホットスタートを実装する方法
GitLabのDocker使用法gitlab ドッカー起動コマンド docker run -d -p...
1. SVNサーバーをインストールする yum でサブバージョンをインストール2. SVNバージョン...
まず、イメージをプルします(またはコンテナを作成するだけで、自然にプルされます)。 docker p...
目次1. 結論から始めましょう2. キーの役割2.1 例2.2 上記の例を修正する2.3 例を再度修...
<br />しばらくの間、多くの人が XHTML の使い方を知らないことに気付きました。...
目次1. Tomcatを監視する方法2. Java独自の監視コマンド3. Tomcatのトラブルシュ...
効果は以下のとおりです。 例1 例2:例1[結婚式の計画]を例にとるHTML: <div cl...
まず、完成した効果をお見せしましょう 主なアイデア: 実際、このブラインドは一種の手品を使用していま...
鏡とは何ですか?イメージは、複数のイメージ レイヤー (UnionFS および AUFS ファイル ...
目次画像をプルするイメージを実行する(コンテナを生成する)コンテナを起動するコンテナに入るすべてのミ...
入力ボックスには、コンテンツを入力するときに常に入力履歴が表示されます。これを無効にする現在の方法は...
1. 環境の説明(1) CentOS-7-x86_64、カーネルバージョン uname -r は、 ...
1. MySQLをダウンロードする1.1 ダウンロードアドレスhttps://downloads.m...
アプリケーションシナリオ多くの場合、Linux サーバーに tomcat や nginx などのソフ...
目次1. テレポートの使用2. モーダルダイアログコンポーネントを完成させる3. コンポーネントのレ...