Subversion / SharpSvn Транзакции - PullRequest
       21

Subversion / SharpSvn Транзакции

0 голосов
/ 23 февраля 2012

Я пытаюсь синхронизировать рабочий процесс, когда некоторые действия выполняются в нескольких системах. Одна из этих систем - Subversion, использующая SharpSvn, другая - SqlServer, а третьи - системы, поддерживающие распределенные транзакции.

Есть ли способ включить SharpSvn / Subversion в рабочий процесс и зарегистрировать его в транзакции, чтобы он мог выполнить откат в случае сбоя?

В частности, я имею в виду Add, Delete, которые представляют собой локальные транзакции, влияющие на локальную файловую систему, и Update, Revert, Checkout, которые представляют собой все транзакции, вызываемые против subversion.

Я не нашел ничего в подрывной книге о транзакциях.

1 Ответ

1 голос
/ 23 февраля 2012

Сам по себе Subversion не имеет понятия «транзакции».Команды Subversion, которые изменяют удаленный репозиторий, являются атомарными, и многие, которые изменяют рабочую копию, легко обратимы, поэтому обычно нет необходимости в «транзакции» в обычном смысле.Если вашему приложению требуются транзакции, вы должны иметь возможность собрать собственную платформу для поддержки этого (я не знаю ни одного заранее созданного решения).

Вероятно, проблема, с которой вы столкнетесь, будет прервана.сделкаЕсли команда «подготовить» транзакции фиксирует входящее изменение, нет простого способа «отменить» уже выполненную фиксацию.Вы можете выпустить второй коммит, который просто отменяет исходное изменение (например, обратное слияние), но при этом в хранилище будут добавлены две новые ревизии (HEAD выглядит одинаково до и после неудачной транзакции, ноон не является действительно неизменным, поскольку теперь существует промежуточная версия).Вы можете использовать команды svnadmin, чтобы выгрузить репозиторий и отфильтровать ревизию, которую вы хотите откатить, но это рискованно и может легко привести к проблемам.Subversion разработан таким образом, что он не теряет историю, поэтому удаление чего-либо из истории хранилища обязательно затруднительно (другие системы контроля версий, такие как git, делают это намного проще).

Один из способов обойти это можетиспользовать репозиторий git в качестве промежуточной области для входящих коммитов.Когда команда «подготовить» транзакции отправляется, входящее изменение фиксируется в git-репо.Если команда «abort» отправлена, фиксация удаляется из репозитория git через git reset.Команда commit указывает git (через git-svn) отправить коммит в репозиторий Subversion.Таким образом, хранилище Subversion не изменяется, если транзакция не зафиксирована, но на сервере по-прежнему хранятся данные, которые кэшируются таким образом, с которым легко работать.

...