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 でホットデプロイメントとホットスタートを実装する方法
docker-compose で mongodb と mysql を構築する詳細な方法を見てみましょ...
yum クイックインストール mysql yumリポジトリを追加する rpm -Uvh http:...
自動ビルドとは、Docker Hub を使用して、Dockerfile ファイルを含む GitHub...
目次概要CommonJS 仕様Node の CommonJS 仕様の実装モジュールのエクスポートとイ...
目次1. 背景2. サイレントログインとは何ですか? 3. カスタムログイン状態を維持する方法4. ...
目次背景glibc 2.14をコンパイルするソフトリンクを変更するやっと背景テスト環境には Cent...
MySQLは独立した書き込み分離を設定します。コードに次のものを書くと問題が発生する可能性があります...
目次序文1. 準備 - サーバーとnginxの使用1. サーバーを準備する2. nginxをインスト...
navicatを使用してテストと学習を行います。まず、 set autocommit = 0;を使用...
目次概要1. スタックとヒープ2. 変数オブジェクトと基本データ型3. 参照データ型とヒープメモリメ...
以前はaタグのname属性を使ってジャンプする方法しか知らなかったのですが、idも使えることを今日知...
この記事では、参考までにMySQL 8.0に接続できないJavaの問題をまとめて紹介します。具体的な...
1. Reactコンポーネントを定義する2つの方法1. 関数コンポーネント。単純な関数コンポーネント...
コードをコピーコードは次のとおりです。 <form action="/hehe&qu...
1. スクロールの実装原理better-scroll のスクロール原理は、ブラウザのネイティブスクロ...