2013-07-30 39 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):这意味着“当事务处理完成时,所有更改都成功承诺,或在事务回滚时撤消所有更改“。 “数据库始终保持一致的状态”。和“事务的结果是持久的:一旦提交操作成功,由该事务所做的更改是安全的,从电源故障,系统崩溃,[...]”。 –