Возможно ли сопоставить транзакцию COMMIT / парадигму "все или ничего" СУРБД с R? - PullRequest
1 голос
/ 27 октября 2011

Есть ли способ реализовать что-то вроде транзакций COMMIT СУБД в R, чтобы обеспечить парадигму «все или ничего» (например, сохранить файл на жесткий диск, только если путь к файлу в таблице хранится вСУБД также была успешной)?

РЕДАКТИРОВАТЬ 2011-10-27 Меня попросили конкретизировать:

Предположим, у вас есть функция, которая выполняет ряд задач: отправка http-запроса,передать информацию о состоянии главному процессу, сохранить файл rdata в некотором каталоге, изменить некоторые таблицы в БД и т. д. Я хотел бы предотвратить только частичный «успех» этой функции, например, сохранение файла, но таблицы БД не обновляются, чтоможет легко случиться, когда функция завершит работу до завершения части базы данных.По сути, мои сценарии использования - это всяческие данные о согласованности данных.

Надеюсь, что это сделает его более полным.

1 Ответ

2 голосов
/ 27 октября 2011

Это немного сложно, потому что трудно понять, как отменить все те вещи, которые вы, возможно, сделали, которые нужно отменить. При использовании СУБД START TRANSACTION START помещает небольшой маркер в файл DB, а затем, если что-то не получается, он знает, куда вернуться, до наступления COMMIT, а затем все изменения от START TRANSACTION до COMMIT записываются в камне Объяснение значительно упрощено).

Единственное, что я могу вам помочь, это функции "try", которые будут отлавливать ошибки. В этом случае ваш код будет определять, сколько ему удалось сделать, и как отменить его, прежде чем продолжить.

Если вы помещаете вещи в функции, можно использовать такой тип шаблона:

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

[да, это даже не синтаксис R, но вы должны получить картину]

и тогда вы делаете:

 foo = updatefoo(foo)

и вы можете быть уверены, что foo не изменится, если что-то пойдет не так в updatefoo ....

...