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