多个用户可以同时提交SVN吗?它是线程安全的吗?

时间:2013-04-08 13:30:27

标签: multithreading svn thread-safety svnkit multi-user

应用程序必须以这样的方式进行设计,即在进入SVN Repositiry时必须支持多个用户。我已完成应用程序和相关的东西,但是,我坚持这个多用户的事情。 我如何实现这一目标?我看到每个线程都需要实例化一个单独的SVNRepository驱动程序。这告诉它不是线程安全的。或者可能是我弄错了。对此问题的任何帮助表示赞赏。感谢。

我从Here获得了上述信息(斜体)。

1 个答案:

答案 0 :(得分:2)

我是SVNKit开发人员,让我解释一下这些工作原理。

SVNRepository类用它自己的凭据表示一个SVN连接。它是线程不安全的,这意味着您只能对它执行顺序操作。有关更多详细信息,请参阅此文章:

http://vcs.atspace.co.uk/2012/09/21/are-svnkit-methods-reenterable/

因此,如果您的应用程序尝试同时创建多个提交,则应使用多个独立的SVNRepository实例。好消息是不需要特殊的同步代码,所有同步都在服务器端执行。另一个好消息是,当某个SVNRepository对象的提交完成或取消时,您可以重用该连接来启动另一个提交。但请注意,如果使用http协议,即使您更改了连接的凭据(SVNRepository#setAuthenticationManager),也无法使用相同的连接代表其他用户进行提交。

要创建没有工作副本的提交,请使用SVNRepository#getCommitEditor启动提交事务。要停止事务,请使用ISVNCommitEditor #closeEdit或ISVNCommitEditor#abortEdit;您可以在SVNRepository实例上执行其他操作,直到提交事务完成。

ISVNCommitEditor实例应该描述您的虚拟工作副本:它告诉SVNKit您当前对最新工作副本状态的了解。如果描述与最新的实际更改不符,则会显示“文件或目录已过期;请尝试更新”错误。

http://vcs.atspace.co.uk/2012/07/20/subversion-remote-api-committing-without-working-copy/

您可以在ISVNEditor#openFile / openDir中使用-1代替实际修订来禁用检查,但这可能会导致另一个问题:您可以在不知道更改的情况下覆盖更改。

另一种选择是使用实际工作副本和文件系统上的实际更改(使用SvnOperationFactory #createCommit)。但即使在这种情况下,也要查看第一个链接,了解哪些对象可以/不能跨线程重用。

希望这有帮助,如果您有其他问题,请随时在SVNKit邮件列表上询问。