2009-06-01 2 views
8

私は別のものに1つのテーブルを "アトミックに"コピーしようとしています。基本的には、テーブルを定期的に更新して、別のプロセスがテーブルを更新している場合に、テーブルから読み取るプロセスで不完全な結果が得られないようにしたい。1つのMySQLテーブルを別のものにアトミックにコピーしていますか?

背景情報を提供するには、ゲームのリーダーボードとして機能するテーブルが必要です。このリーダーボードは、数分ごとに別のプロセスで更新されます。私の考えは次の通りです:

テーブルSCORESには、ユーザーがリーダーボードを閲覧したときに読み込まれる公開閲覧可能なリーダーボードが含まれています。この表は数分ごとに更新されます。リーダーボードを更新するプロセスによって、新しいリーダーボードを含むSCORES_TEMPテーブルが作成されます。そのテーブルが作成されたら、すべての内容を「原子的に」SCORESにコピーしたいと思います。私がしたいことは、次のようなものです:

TRUNCATE TABLE SCORES; 
INSERT INTO SCORES SELECT * FROM SCORES_TEMP; 

私はSCORESのすべてを置き換えたいと思います。私は私の主キーまたは自動インクリメント値を維持する必要はありません。 SCORES_TEMPからすべてのデータを取り込みたいだけです。しかし、私は、これらの2つのステートメントが実行される前に誰かがスコアを見ると、リーダーボードが空白になることを知っています。これを原子的に行うと、空白や不完全なデータが表示されません。ありがとう! MySQLでは

答えて

11

使用rename table

RENAME TABLE old_table TO backup_table, new_table TO old_table; 

それはアトミックですが、すべてのストレージ上で動作しますエンジン、再構築する必要はありませんインデックスを作成します。

+0

トランザクションは間違いなく私が彼らが持っている原子的ニーズを達成することができると分かっていますが、この表の名前を変更するソリューションはこれに最適です特定の状況。みんな、ありがとう! – DivideByHero

2

、理由the behavior of TRUNCATEの私は、あなたがする必要がありますと思う:私はDDL操作のトランザクションが安全効果的に常にあるものを作るための方法がありますかわからない

BEGIN TRANSACTION; 
DELETE FROM SCORES; 
INSERT INTO SCORES SELECT * FROM SCORES_TEMP; 
COMMIT TRANSACTION; 

+0

「DDL操作」とは何ですか?ありがとう... – DivideByHero

+0

DDL =データ定義言語 - CREATE TABLEのようなもの –

0

私は取引に熱いMySQLのお得な情報を知らないが、T-SQLであなたは

BEGIN TRAN 
DELETE FROM SCORES 
INSERT INTO SCORES SELECT * FROM SCORES_TEMP 
COMMIT TRAN 

あなたの操作は「アトミック」が、瞬間的ではないだろう。この方法を書くことができます。 (MyISAM用)

2

あなたは(InnoDBのため)トランザクションを使用することができ、

BEGIN TRANSACTION; 
DELETE FROM SCORES; 
INSERT INTO SCORES SELECT * FROM SCORES_TEMP; 
COMMIT; 

LOCK TABLES

LOCK TABLES; 
DELETE FROM SCORES; 
INSERT INTO SCORES SELECT * FROM SCORES_TEMP; 
UNLOCK TABLES; 
関連する問題