可以将RDBMS的COMMIT事务/“all-or-nothing”范例映射到R?

时间:2011-10-27 16:26:56

标签: mysql r transactions commit rdbms

有没有办法在R中实现RDBMS的COMMIT事务之类的东西,以确保“全有或全无”范例(例如,如果将文件路径存储在表中的文件路径中,则只保存文件到硬盘驱动器RDBMS也是成功的)?

编辑2011-10-27 我被要求更具体:

假设您有一个执行许多任务的函数:发送http请求,将状态信息传递给主进程,将rdata文件保存在某个目录中,更改db中的某些表等。我想仅阻止该功能的部分“成功”,例如正在保存文件但未更新数据库表,这在函数在完成数据库部分之前崩溃时很容易发生。基本上,我的用例是各种数据一致性的东西。

希望它更全面。

1 个答案:

答案 0 :(得分:2)

这有点棘手,因为很难知道如何撤消你可能已经完成的所有需要​​撤消的事情。使用RDBMS,TRANSACTION START在DB文件中放置一个小标记,然后如果有任何失败,它知道返回的位置,直到COMMIT到来,然后从TRANSACTION START到COMMIT的所有内容都写在石头上(这解释大大简化)。

我能想到的唯一可以帮助你的是“尝试”功能,它会捕获错误。然后,你的代码的工作就是计算它设法做了多少以及如何在继续之前撤消它。

如果你把东西放在函数中,就可以使用这种模式:

updatefoo = function(foo){
             try(foo2=something(foo));
             if the try failed:
                return(foo)
             else:
                return(foo2)
            }

[是的,这甚至不是R语法,但你应该得到图片]

然后你做:

 foo = updatefoo(foo)

如果updatefoo中出现问题,你可以确定foo不会改变....