2013-07-30 40 views
0

我在處理從一個文件到另一個文件的數據庫表項的副本時遇到問題。如何在這種情況下使數據庫一致?

假設我有兩個表,稱爲one.sql,two.sql,現在我wana將一些記錄從one.sql傳輸到表two.sql,然後從one.sql ater複製成功中刪除該條目。

問題:假設電源已經走了後,我做副本從一到二,從做一個wasnt在這種情況下,同一個記錄將兩個表中刪除記錄 ,在這裏。我不想要。所以在這種情況下如何處理這些類型的不一致。

+0

這是否發生了很多? – Strawberry

+0

@strawberry這將是一個問題,如果我不能從第一張表刪除該記錄..所以我如何確保它將被刪除? –

回答

3

您的RDBMS是而不是一個簡單的數據存儲!它支持journalingtransaction isolationatomic updates。所以......

...對事務表(InnoDB的)和體面的隔離級別簡單地做:

START TRANSACTION -- Or SET autocommit = 0 
INSERT INTO two SELECT * FROM one WHERE ...; 
DELETE FROM one WHERE ...; 
COMMIT 

COMMIT原子更改應用到數據庫。也就是說,從其他交易的角度來看,此舉或者是完成未開始。沒有人能看到它一半完成。即使發生災難性故障(停電)。

當然,如果你移動所有你的記錄,你也可以依靠RENAME TABLE ...

+0

是的,你可以給我一些關於事務隔離和原子更新的更多信息,請提供一些有用的鏈接讓我瞭解這些。 –

1

您可以使用transaction blocks在一定程度上descrease意想不到的效果。但解決電力問題是另一回事。

但是,如果您擔心電源問題,則可以使用批處理並檢查兩個表是否在某個間隔不包含相同的記錄。

+0

「但解決電力問題是另一回事。」這只是*不*真*。具有事務表(* InnoDB *)的MySQL是[ACID](http://dev.mysql.com/doc/innodb/1.1/en/glossary.html):這意味着「當事務處理完成時,所有更改都成功承諾,或在事務回滾時撤消所有更改「。 「數據庫始終保持一致的狀態」。和「事務的結果是持久的:一旦提交操作成功,由該事務所做的更改是安全的,從電源故障,系統崩潰,[...]」。 –