2013-04-08 67 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郵件列表上詢問。

相關問題