One thing I do know is that commits in Solr are global, so there's no way
to do this with concurrency.

That being said, Solr doesn't tend to accept updates that would generate
errors once committed in my experience.


Michael Della Bitta

------------------------------------------------
Appinions
18 East 41st Street, 2nd Floor
New York, NY 10017-6271

www.appinions.com

Where Influence Isn’t a Game


On Thu, May 2, 2013 at 3:06 AM, mark12345 <marks1900-pos...@yahoo.com.au>wrote:

> I am wondering if it was possible to achieve SolrJ/Solr Two Phase Commit.
> Any examples?  Any best practices?
>
> What I know:
> * Lucene offers Two Phase Commit        via it's index writer
> (prepareCommit()
> followed by either commit() or rollback()).
>
>
> http://lucene.apache.org/core/4_2_0/core/org/apache/lucene/index/IndexWriter.html
>
> * I know Solr Optimistic Concurrency is available.
> http://yonik.com/solr/optimistic-concurrency/
> <http://yonik.com/solr/optimistic-concurrency/>
>
>
> I want a transactional behavior that ensures that there is a full commit or
> full rollback of multiple documents.  I do not want to be in a situation
> where I don't know if the beans have been written or not written to the
> Solr
> instance.
>
> * Code Snippet
>
> > try {
> >       UpdateResponse updateResponse = server.add(Arrays.asList(docOne,
> > docTwo));
> >       successForAddingDocuments = (updateResponse.getStatus() == 0);
> >       if (successForAddingDocuments) {
> >               UpdateResponse updateResponseForCommit = server.commit();
> >               successForCommit = (updateResponseForCommit.getStatus() ==
> 0);
> >       }
> > } catch (Exception e) {
> > } finally {
> >       if (!successForCommit) {
> >               System.err.println("Rolling back transaction.");
> >               try {
> >                       UpdateResponse updateResponseForRollback =
> server.rollback();
> >                       if (updateResponseForRollback.getStatus() == 0) {
> >                               successForRollback = true;
> >                       } else {
> >                               successForRollback = false;
> >                               System.err.println("Failed to rollback!
>  Bad as state is now
> > unknown!");
> >                       }
> >               } catch (Exception e) {
> >               }
> >       }
> > }
>
> * Full Test class
>
> > @Test
> > public void documentTransactionTest() {
> >
> >       try {
> >               // HttpSolrServer server = ...
> >               server.deleteById(Arrays.asList("1", "2"));
> >               server.commit();
> >       } catch (Exception e) {
> >               e.printStackTrace();
> >       }
> >
> >       SolrInputDocument docOne = new SolrInputDocument();
> >       {
> >               docOne.addField("id", 1L);
> >               docOne.addField("type_s", "MyTestDoc");
> >               docOne.addField("value_s", "docOne");
> >               docOne.addField("_version_", -1L);
> >       }
> >
> >       SolrInputDocument docTwo = new SolrInputDocument();
> >       {
> >               docTwo.addField("id", 2L);
> >               docTwo.addField("type_s", "MyTestDoc");
> >               docTwo.addField("value_s", "docTwo");
> >               docTwo.addField("_version_", -1L);
> >       }
> >
> >       boolean successForAddingDocuments = false;
> >       boolean successForCommit = false;
> >       boolean successForRollback = false;
> >
> > //        throw new SolrServerException("Connection Broken");
> >
> >       try {
> >               UpdateResponse updateResponse =
> server.add(Arrays.asList(docOne,
> > docTwo));
> >               successForAddingDocuments = (updateResponse.getStatus() ==
> 0);
> >               if (successForAddingDocuments) {
> >                       UpdateResponse updateResponseForCommit =
> server.commit();
> >                       successForCommit =
> (updateResponseForCommit.getStatus() == 0);
> >               }
> >       } catch (Exception e) {
> >       } finally {
> >               if (!successForCommit) {
> >                       System.err.println("Rolling back transaction.");
> >                       try {
> >                               UpdateResponse updateResponseForRollback =
> server.rollback();
> >                               if (updateResponseForRollback.getStatus()
> == 0) {
> >                                       successForRollback = true;
> >                               } else {
> >                                       successForRollback = false;
> >                                       System.err.println("Failed to
> rollback!  Bad as state is now
> > unknown!");
> >                               }
> >                       } catch (Exception e) {
> >                       }
> >               }
> >       }
> >
> >       {
> >               try {
> >                       QueryResponse response = server.query(new
> > SolrQuery("*:*").addFilterQuery("type_s:MyTestDoc"));
> >
> >                       if (successForCommit) {
> >                               Assert.assertEquals(2,
> response.getResults().size());
> >                               Assert.assertEquals("docOne",
> > response.getResults().get(0).get("value_s"));
> >                               Assert.assertEquals("docTwo",
> > response.getResults().get(1).get("value_s"));
> >                       } else if (successForRollback) {
> >                               Assert.assertEquals(0,
> response.getResults().size());
> >                       } else {
> >                               // UNKNOWN STATE
> >
> >                               if (response.getResults().size() == 0) {
> >                                       // rollback must have been
> successful
> >                               } else if (response.getResults().size() ==
> 2) {
> >                                       // commit was successful
> >                               } else {
> >                                       Assert.fail();
> >                               }
> >                       }
> >               } catch (Exception e) {
> >                       Assert.fail();
> >               }
> >       }
> >
> > }
>
>
> http://lucene.apache.org/solr/4_2_0/solr-solrj/org/apache/solr/client/solrj/impl/HttpSolrServer.html
>
>
>
>
>
> --
> View this message in context:
> http://lucene.472066.n3.nabble.com/SolrJ-Solr-Two-Phase-Commit-tp4060399.html
> Sent from the Solr - User mailing list archive at Nabble.com.
>

Reply via email to