[ 
https://issues.apache.org/jira/browse/JDO-619?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12713724#action_12713724
 ] 

Marco commented on JDO-619:
---------------------------

Adding an optional boolean parameter to pm.getObjectById(...) IMHO has the 
downside that already quite a few overloaded getObjectById(...) methods exist, 
where one of them already has a boolean parameter:

a) getObjectById(java.lang.Class cls, java.lang.Object key)
b) getObjectById(java.lang.Object oid)
c) getObjectById(java.lang.Object oid, boolean validate)

There's the question, to which of these getObjectById-methods do you want to 
add it? Adding it as last parameter is obviously only possible for (a) and (c) 
leading to 2 new methods. Alternatively you could add it at as first parameter 
and then have 3 new methods.

Is that helpful? Or confusing?

Any other opinions?


The PM.serializeRead(Object) is IMHO a really good idea. If I understand you 
correctly, that's more or less the same as writing:

myTransaction.setSerializeRead(true);
pm.refresh(myPersistenceCapable);
myTransaction.setSerializeRead(null);

Right? Probably the only difference is that the above code might overwrite any 
previously set value (that's why we encapsulate the 
Transaction.setSerializeRead(...) calls and employ reference counting - we're 
using code like the above quite often).

When you add pm.serializeRead(Object), you'd need additionally 
pm.serializeReadAll(Collection) to be somehow symmetric with all other methods 
(detach/detachAll, refresh/refreshAll etc.) and to give the JDO implementation 
the ability for optimization.

> API required for enabling/disabling FOR UPDATE locking for SELECTs
> ------------------------------------------------------------------
>
>                 Key: JDO-619
>                 URL: https://issues.apache.org/jira/browse/JDO-619
>             Project: JDO
>          Issue Type: New Feature
>          Components: api2, specification, tck2
>            Reporter: Marco
>             Fix For: JDO 2 maintenance release 3
>
>         Attachments: jdo619.patch
>
>
> We - http://www.jfire.org - have some code where it is essential that objects 
> read from the datastore are not manipulated by another transaction before 
> they are modified and written to the datastore. In SQL, you use "SELECT ... 
> FOR UPDATE" for this purpose, which locks the records included in the query 
> result till the end of the transaction just like a write operation does.
> In JDO, it is currently not yet possible to control whether reading causes 
> read-locks (simple SELECT) or write-locks (SELECT ... FOR UPDATE). There are, 
> however, vendor-specific solutions already. Thus, I'd like to first point out 
> how DataNucleus solves this problem:
> 1) The page RDBMS persistence 
> properties<http://www.datanucleus.org/products/accessplatform/rdbms/persistence_properties.html>
> describes the property "datanucleus.rdbms.useUpdateLock" which applies to all 
> queries. This would leave our code pure-JDO (not
> DataNucleus-dependent), but it's unfortunately not what we need: Most of the 
> time a lock is not required and this option would therefore
> unnecessarily slow down our application.
> 2) The page 
> JDOQL<http://www.datanucleus.org/products/accessplatform/rdbms/jdoql.html> 
> shows this code snippet:
>     ((org.datanucleus.jdo.JDOTransaction)pm.currentTransaction()).setOption(
>         "transaction.serializeReadObjects", "true"
>     );
> This applies to all subsequent queries of one transaction. It works fine to 
> enable/disable the option back and forth during the same transaction. 
> Obviously, this is the most useful way to control the use of write-locks 
> during read operations.
> 3) Additionally, the same page mentions that you can set 
> "datanucleus.rdbms.query.useUpdateLock" as a JDOQL extension. I assume
> that's simply code like this:
>     query.addExtension("datanucleus.rdbms.query.useUpdateLock", "true");
> In contrast to solution (2), this only affects the single explicit query and 
> no implicit queries which are used when accessing fields of the returned 
> object(s).
> Having explained all this, I'd like to request the following feature for the 
> next JDO release (2.3):
> Please extend javax.jdo.Transaction and add 2 methods:
>   void setSerializeReadObjects(boolean)
>   boolean isSerializeReadObjects()
> This would make DataNucleus' solution (2) - see above - available via the JDO 
> API.
> Additionally, please extend javax.jdo.Query and add 2 new method:
>   void setSerializeReadObjects(boolean)
>   boolean isSerializeReadObjects()
> This represents JDO-API for DataNucleus' solution (3) - see above.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to