Re: Transactions Saving Querying
the search index is not transactional. i.e. the items are indexed after the transaction is comitted. that's why you can't find them unless you commit the transaction. regards, toby On 8/8/06, Rasik Pandey [EMAIL PROTECTED] wrote: Hi Jackrabbit Developers, Could someone have a look at the thread I posted over on the Spring JCR forum. http://forum.springframework.org/showthread.php?t=27738 Essentially, I am unable to save nodes and then query and find them within the same session and transaction. One thing to keep in mind, is that the transaction is never committed in my scenario. I am able to reproduce this same behavior in Jackrabbit's XATest case by adding few lines of code to the testAddNodeCommit method. Basically, I run a query after saving the testRootNode and prior to committing the transaction. You will see a second assertion which succeeds after the commit. Regards, Rus Pandey /** * Add a node inside a transaction and commit changes. Make sure * node exists for other sessions only after commit. * @throws Exception */ public void testAddNodeCommit() throws Exception { // get user transaction object UserTransaction utx = new UserTransactionImpl(superuser); // start transaction utx.begin(); // add node and save Node n = testRootNode.addNode(nodeName1, testNodeType); n.addMixin(mixReferenceable); testRootNode.save(); Query q = superuser.getWorkspace().getQueryManager().createQuery(//+nodeName1, Query.XPATH); assertEquals(1 result Node from querying before commit AND after save, 1, q.execute().getNodes().getSize()); // assertion: node exists in this session try { superuser.getNodeByUUID(n.getUUID()); } catch (ItemNotFoundException e) { fail(New node not visible after save()); } // assertion: node does not exist in other session Session otherSuperuser = helper.getSuperuserSession(); try { otherSuperuser.getNodeByUUID(n.getUUID()); fail(Uncommitted node visible for other session); } catch (ItemNotFoundException e) { /* expected */ } // commit utx.commit(); assertEquals(1 result Node from querying after commit, 1, q.execute().getNodes().getSize()); // assertion: node exists in this session try { otherSuperuser.getNodeByUUID(n.getUUID()); } catch (ItemNotFoundException e) { fail(Committed node not visible in this session); } // assertion: node also exists in other session try { otherSuperuser.getNodeByUUID(n.getUUID()); } catch (ItemNotFoundException e) { fail(Committed node not visible in other session); } // logout otherSuperuser.logout(); } -- - [EMAIL PROTECTED] --- Tobias Bocanegra, Day Management AG, Barfuesserplatz 6, CH - 4001 Basel T +41 61 226 98 98, F +41 61 226 98 97 --- http://www.day.com ---
Re: Transactions Saving Querying
Ok this makes sense. Thanks guys. Regards, Rus Pandey On 8/9/06, Marcel Reutegger [EMAIL PROTECTED] wrote: Hi, A query is always executed against the persistent workspace content the session is connected to. Which means it does not take un-committed content into account. The spec says: spec 6.6.7 Search Scope A query searches the persistent workspace associated with the current session. It does not search any pending changes that may be recorded on the session but not yet saved. /spec The last sentence is a bit misleading because it does not take XA transactions into account. Later in the spec there is this clarification: spec 7.1.1.3 Effect of Transactions In repositories that support transactions, all changes, whether workspace-direct or session-mediated, may be further insulated from persistent storage by their transaction context. If a set of write methods is within the scope of a transaction then the changes they make will only be reflected in persistent storage upon commit of that transaction. /spec Section 8.1.3 Save vs. Commit also talks about the effects of XA transactions in more detail. regards marcel Rasik Pandey wrote: Hi Jackrabbit Developers, Could someone have a look at the thread I posted over on the Spring JCR forum. http://forum.springframework.org/showthread.php?t=27738 Essentially, I am unable to save nodes and then query and find them within the same session and transaction. One thing to keep in mind, is that the transaction is never committed in my scenario. I am able to reproduce this same behavior in Jackrabbit's XATest case by adding few lines of code to the testAddNodeCommit method. Basically, I run a query after saving the testRootNode and prior to committing the transaction. You will see a second assertion which succeeds after the commit. Regards, Rus Pandey /** * Add a node inside a transaction and commit changes. Make sure * node exists for other sessions only after commit. * @throws Exception */ public void testAddNodeCommit() throws Exception { // get user transaction object UserTransaction utx = new UserTransactionImpl(superuser); // start transaction utx.begin(); // add node and save Node n = testRootNode.addNode(nodeName1, testNodeType); n.addMixin(mixReferenceable); testRootNode.save(); Query q = superuser.getWorkspace().getQueryManager().createQuery(//+nodeName1, Query.XPATH); assertEquals(1 result Node from querying before commit AND after save, 1, q.execute().getNodes().getSize()); // assertion: node exists in this session try { superuser.getNodeByUUID(n.getUUID()); } catch (ItemNotFoundException e) { fail(New node not visible after save()); } // assertion: node does not exist in other session Session otherSuperuser = helper.getSuperuserSession(); try { otherSuperuser.getNodeByUUID(n.getUUID()); fail(Uncommitted node visible for other session); } catch (ItemNotFoundException e) { /* expected */ } // commit utx.commit(); assertEquals(1 result Node from querying after commit, 1, q.execute().getNodes().getSize()); // assertion: node exists in this session try { otherSuperuser.getNodeByUUID(n.getUUID()); } catch (ItemNotFoundException e) { fail(Committed node not visible in this session); } // assertion: node also exists in other session try { otherSuperuser.getNodeByUUID(n.getUUID()); } catch (ItemNotFoundException e) { fail(Committed node not visible in other session); } // logout otherSuperuser.logout(); }