私たちのデータベースでは、イベントで多数のストアドプロシージャを定期的に呼び出して統計を生成しています。
2つのSPがあることを考慮
auto_update_daily_users
auto_update_daily_orders
同じ一時テーブル名を使用すると競合が発生しますか(temp1
)両方のストアドプロシージャで?
Stack OverflowでQ&Aを確認したところ、一時テーブルのスコープは現在のセッションであるとのことです。これは、dbサーバーをクライアントに接続するときのことだと思います。
しかし、私の場合、すべてのspはサーバー側で実行されています。だから誰かがこれを説明できますか?
一時テーブルは、1つのSP=が終了すると自動的に破棄されますか?2つのSPが同時に実行されている場合はどうなりますか?同じセッションで実行されていませんか?
私の場合、すべてのspはサーバー側で実行されています
いずれの場合も、SPは(たとえば、イベントスケジューラからの)クライアント接続を使用して実行されます。それらが外部SP/UDFから1つずつ呼び出される場合-それらは同じ接続で実行され、2番目の起動時に1stSPによって作成された一時テーブルが存在します。それらが独立して実行される場合(たとえば、2つの別個のイベントプロシージャとして/から)-それらは異なる接続で実行され、それぞれに独自の独立した(ローカル)一時テーブルがあります。
サーバーはクエリのみを受け入れ、その結果を返します。クエリを送信してその結果を受信するものはすべてクライアントです。 SHOW PROCESSLIST
を参照してください。すべてのクライアント接続が表示されます。これには、Event Schedulerサービス接続と実行されたイベント接続が含まれ、個別のイベントごとに個別の接続が表示されます。
SPが終了すると、一時テーブルは自動的に破棄されますか?
一時テーブルには接続スコープがあります。 2つの異なる接続で2つのSPを実行する場合、名前が同じであるにもかかわらず、それぞれに独自の構造とデータを持つ独自の一時テーブルがあります。
1つのSPを実行した後、別の1つを実行した後、接続を閉じ、2番目を実行するために新しい接続を作成した場合、各SPには独自の一時テーブルが再び存在します。
ただし、1つのSPを実行すると、同じ接続で別のインスタンスが実行され、2番目の起動時に1番目で作成されたtemptableが存在し、1番目でデータが挿入されます。 - アキナ
プランA:異なるEVENTで異なる一時テーブル名を使用します。
プランB:connection_id()
を使用して一時テーブル名を作成します。
_mysql> SELECT @tmp := CONCAT("_T_", connection_id());
+----------------------------------------+
| @tmp := CONCAT("_T_", connection_id()) |
+----------------------------------------+
| _T_453 |
+----------------------------------------+
_
次に、問題のクエリを準備して実行します。
プランC:GET_LOCK(..)
(etc)を使用して、あるイベントが別のイベントの一時テーブルを使用しないようにします。