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 でホットデプロイメントとホットスタートを実装する方法
1つ: 1.セマンティック タグは単なる HTML であり、CSS にはセマンティクスはありません...
データベースの移行は、よく遭遇する問題です。データ量が少ない場合、移行は基本的に問題になりません。実...
この記事では、具体的な例を使用して、CentOS 7 から CentOS 8 にアップグレードする方...
目次1. 接続管理2. オプティマイザレベルでの改善3. 機能の改善4. パフォーマンススキーマの最...
ゴミ箱は Linux ユーザー、Windows ユーザー、Mac ユーザーにとって非常に一般的なので...
目次スロットなしVue2.x スロットスロット付き名前付きスロットスロット属性なしスロットの簡単なサ...
ヒント1: 集中力を保つ最高のモバイル アプリは、1 つのことを非常にうまく行うことに重点を置いてい...
新しい Linux ディストリビューションには rc.local ファイルがなくなりました。サービス...
目次Vue ファースト スクリーン パフォーマンス最適化コンポーネント説明するインターセクションオブ...
1. CSS スプライトを使用します。利点は、CSS で使用される小さな画像を 1 つの大きな画像に...
MySQL データベースは、特に JAVA プログラマーの間で広く使用されています。クラウド データ...
1. インデックス不足または無効なインデックスによるクエリの遅延数千万件のデータを含むテーブルで、イ...
Flash ファイル形式: .FLV および .SWFフラッシュ ビデオ形式には、.flv と .s...
複数の値を組み合わせて表示これで、図1から図2に示す要件が揃いました。 どうやってやるんですか?次の...
CSS メディア クエリには非常に便利なアスペクト比、aspect-ratio があり、幅と高さを直...