我正在尝试同步一个工作流,其中一些操作发生在几个系统之间。其中一个是Subversion,使用SharpSvn,另一个是SqlServer,还有一些是支持分布式事务的系统。
有没有一种方法可以将SharpSvn / Subversion包含在工作流中,并将其注册到事务中,以便在失败的情况下可以回滚?
特别是,我认为Add、Delete是影响本地文件系统的本地事务,Update、Revert、Checkout是针对subversion调用的所有事务。
我在subversion红皮书中没有找到任何关于事务的东西。
发布于 2012-02-23 06:18:29
Subversion本身没有任何“事务”的概念。修改远程存储库的Subversion命令是原子的,并且许多更改工作副本的命令很容易逆转,因此通常不需要典型意义上的“事务”。如果您的应用程序需要事务,您应该能够组合一个自定义框架来支持这一点(我不知道是否有任何预先构建的解决方案)。
您将遇到的问题很可能是中止事务。如果事务的"prepare“命令提交了传入的更改,则没有简单的方法来”撤消“已经发生的提交。您可以发出第二个commit命令,简单地恢复原始更改(例如反向合并),但这样做会向存储库添加两个新的修订版本(HEAD在失败的事务前后看起来是一样的,但它并不是真正未修改的,因为现在有一个中间修订版本)。您可以使用svnadmin命令转储存储库,并过滤掉您想要回滚的修订,但这是有风险的,而且很容易导致问题。Subversion被设计为不会丢失历史记录,因此从存储库历史记录中删除某些内容肯定很困难(其他修订控制系统,如git,使这一点变得容易得多)。
解决这个问题的一种方法可能是使用git存储库作为传入提交的中转区。当发送事务的"prepare“命令时,传入的更改将提交到git代码库中。如果发送了"abort“命令,则会通过git reset从git代码库中删除提交。" commit“命令将告诉git (通过git-svn)将提交推送到Subversion代码库。这样,除非提交事务,否则Subversion存储库不会被修改,但服务器仍然以一种易于使用的方式缓存数据。
https://stackoverflow.com/questions/9402926
复制相似问题