【发布时间】:2013-04-13 16:20:25
【问题描述】:
考虑 Nosql 数据库的以下场景:
假设一条记录从一张表中删除并插入到另一张表中。对于这种情况,必须采取哪些预防措施或错误检查?这是一个交易的例子,意味着两个步骤都应该发生还是都不发生?
【问题讨论】:
-
您指的是具体操作还是新记录/文档的删除和添加。
考虑 Nosql 数据库的以下场景:
假设一条记录从一张表中删除并插入到另一张表中。对于这种情况,必须采取哪些预防措施或错误检查?这是一个交易的例子,意味着两个步骤都应该发生还是都不发生?
【问题讨论】:
您描述的插入和删除是完全不同的操作。 由于所有 NOSQL 数据库都不同,这实际上取决于您要使用的特定数据库是否支持事务。
如果不支持事务,您必须采取的基本预防措施类似于所有需要日志/事务的系统:
查看事务处理方法和 ACID 标准: http://en.wikipedia.org/wiki/Transaction_processing#Methodology
这确实不是一件小事,尽管对于诸如移动命令(不是整个事务系统)之类的小任务是可行的。
所以如果你想拥有一个
MoveDocument(Document document, Database TargetDatabase)
您可以执行以下操作之一:
利用这些来保证两个操作都进行。这取决于您的数据库是否支持事务。不幸的是,CouchDB 没有:Can I do transactions and locks in CouchDB?。
MangoDB 不支持事务,但它确实提供了一些事务功能: http://docs.mongodb.org/manual/faq/fundamentals/#does-mongodb-support-transactions
如果您的 nosql 数据库不支持事务,您可以在自己的代码中编写与数据库交互的事务逻辑。 但是,对数据库的所有命令都必须通过您的 Web 服务/API,并且您必须实现命令历史记录、锁定等代码,这不是一项小任务。
所有通信都必须通过您的网络服务/servlet 等,因为您需要控制不对当前处于事务中的文档/记录进行更改。
这基本上意味着成为开源 nosql 数据库的贡献者。
【讨论】: