2017-04-01 12 views
1

私たちは、私たちの目録を含む製品データベースを持っており、それは別の製品ソースからの新しい(成長している)カタログと合併するでしょう。ソース1の製品は現在0〜50kのIDを持っています(毎月10〜15の新製品が追加されています)。インベントリにまだ追加されていないソース2の商品は、ID:1000000+から始まります。どのカタログからどの製品が来ているのかを認識し、製品表の製品IDを自動的にインクリメントすることを手動で処理するという、統合の容易さと認識を維持することを考えていました。MySQLで自動インクリメントを手動で処理する?

擬似コード

私たちの前に挿入トリガーで

、我々は以下をチェックします私に

if (product_source = 'internal_catalog') { 
new.id = SELECT max(id) + 1 FROM products where product_source = 'internal_catalog'; 
} else { 
new.id = new.original_product_id; -- original_product_id will always be unique and > 1000000; 
} 

、これは理論的には動作するはずですが、明らかに私は、同時実行エラーの心配しますそして衝突。私が見ることのできるところから、上記のトリガーはテーブルをロックして、衝突が起こらないようにします。上記のアプローチに問題はありますか?

答えて

2

表示された擬似コードは、テーブルをロックしないため、同時挿入中の競合状態の影響を受けます。

テーブル全体をロックせずにカスタム自動インクリメント動作を実行する方法はありません。これらの競合状態を避けるためには、同時挿入をブロックする必要があるからです。

代わりに、新しいインクリメントメカニズムを使用して新しいID値を生成することもできます。たとえば、memcachedインスタンスにキーを作成し、atomic increment-and-getコールを使用して新しい一意のID値を取得します。トリガでこれをしないでください。INSERTを実行する前にアプリケーションを実行してください。

しかし、何らかの種類の列挙型として自動インクリメントを使用することを忘れることをお勧めします。ユニークであることが必要です。それだけです。連続でも連続でもありません。

関連する問題