2013-04-08 68 views
0

应用程序必须以这样的方式进行设计,即它必须支持多个用户,同时提交SVN Repositiry。我完成了应用程序和相关的东西,但是,我坚持这个多用户的东西。 我怎么能做到这一点?我看到某个地方为每个线程你必须实例化一个单独的SVNRepository驱动程序。这告诉它不是线程安全的 ..或可能是我得到了错误的整个事情。对此问题的任何帮助表示赞赏。谢谢。多个用户可以同时提交给SVN吗?线程安全吗?

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

+4

您引用的链接特定于SVNKit。 Apache Subversion本身显然支持同时提交。在开发SVN客户端http://svnbook.red-bean.com/en/1.7/index.html – bahrep 2013-04-08 13:37:29

+0

@bahrep之前阅读SVNBook是有道理的,那么同样修订版本号的同时提交怎么办? – 2013-04-08 14:30:06

+1

@Vinayak - 同样的改变只是不可能的。提交是原子操作,两次提交将是不同的事务服务器端 – 2013-04-08 15:29:05

回答

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/

您可以使用-1,而不是在ISVNEditor#中openFile /执行opendir真正的修订禁用检查,但可能会导致另一个问题:你能覆盖的变化不知道他们。

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

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

相关问题