I recognized this problem too some time ago but didn't analyse as deep as Silvie because I had the identity available.


Could you try the query:
select account from testXXX.Account account where description = "account 10"

Regards
Ralf

Werner Guttmann schrieb:
Sylvie,

I've just run a couple of tests trying to create an object and load it again using both Database.load() and OQLQuery.execute() ... and I don't have an problems. Here's a code fragment I used in one of the tests:

        public void testQueryAccountCreatedWithinTransaction() throws Exception 
{
                Account account = null;

                Database db = jdo.getDatabase();

                db.begin();
                account = new Account();
                account.setId (new Integer (10));
                account.setDescription("account 10");
                db.create(account);
                
                OQLQuery query = db.getOQLQuery("select account from testXXX.Account 
account where id = 10");
                QueryResults results = query.execute();
                assertTrue (results.hasMore());
                if (results.hasMore()) {
                        account = (Account) results.next();
                        assertNotNull (account);
                        assertEquals (new Integer(10), account.getId());
                        assertEquals ("account 10", account.getDescription());
                }
                db.commit();

                db.begin();
                account = (Account) db.load (Account.class, new Integer (10));
                db.remove (account);
                db.commit();

                db.close();
        }

As you can see, I am creating a new Account instance (id 10), and use a OQLQuery to obtain the very same object again.

If that little code fragment does not mimick what you are doing, let me know 
where the difference is.

Regards
Werner

On Tue, 09 Nov 2004 19:01:35 +0100, SYLVIE PALLUEL wrote:


I have only one transaction to do everything. So I shouldn't have pb with
transaction isolation.

After having read your answer, I've made new tests.

While using a database which supports rollback, I can do this in the same
transaction:
. create an object A
. read back the object A with a pass-thru OQL query . read back the object A with a db.load(...,objetA.getId())
. apply the rollback


I can't :
. read back the object A with a OQL query


And If I have two different transactions before the rollback, I can't read
(anyway I use) in my transaction #2 the object being created in my
transaction #1. So the transaction isolation is ok.

I think there's really something wrong with the way the OQL query is
executed in this case.
Is there something new on this point with the future version?

The same tests made using direct access by jdbc are ok.

Thanks for your interest.

Sylvie.

P.S.:
I can't commit the create before trying to access the object in OQL, because
I must rollback everything from the beginning, if there's anything wrong
during the whole operation.

I tried to explain to the developers that it should be better to store the
id in a variable somewhere and access later when trying to load it (rather
than through a query, OQL or otherwise)... But they just see the fact that
it must work like simple jdbc way ...



___________________ CREDI RA Sylvie Palluel

[EMAIL PROTECTED]
___________________

-----Message d'origine-----
De : Patrick van Kann [mailto:[EMAIL PROTECTED] Envoyé : mardi 9 novembre 2004 18:06
À : SYLVIE PALLUEL
Objet : RE: RE : RE : [castor-dev] [jdo] Reading, in the same transaction, a
data just created (reading via oql query)


In that case, I think Castor OQL is behaving correctly with respect to
transaction isolation.
MySQL without Innodb simply doesn't support transactions, hence the data is
written regardless of whether you call db.commit().
In order to guarantee that your transaction is isolated, queries should not
have access to the data in the database until it commits for the reason I
stated earlier. If your application uses JDBC or pass-through to load an
object that could become unavailable due a rollback, your app would be in an
inconsistent state.

I think you should consider re-designing your application so that you either
commit the create before trying to access the object in OQL, or you need to
store the id in a variable somewhere that you can access later when trying
to load it (rather than through a query, OQL or otherwise).

In any case, surely OQL is an unreliable way to retrieve an object? What if
you had to results that matched your criteria?

I hope this helps,

Patrick

-----Original Message-----
From: SYLVIE PALLUEL [mailto:[EMAIL PROTECTED]
Sent: Tue 11/9/2004 4:28 PM
To: Patrick van Kann
Subject: RE : RE : [castor-dev] [jdo] Reading,  in the same transaction, a
data  just created (reading via oql query)

Yes, I can confirm that when I rollback the transaction, the new data is not
created in my database (which way I use to test).



For information, I have the problem with MySql Innodb (supports rollback)
and Oracle.

With MySql Isam (no rollback), the program was ok, that means that the Oql
query brings back the new Object ..



In fact it seems that the Oql query tries to retrieve the object from the
database, and is not looking at his cache .



Sylvie.

___________________

CREDI RA

Sylvie Palluel



[EMAIL PROTECTED]

___________________



-----Message d'origine-----
De : Patrick van Kann [mailto:[EMAIL PROTECTED]
Envoyé : mardi 9 novembre 2004 16:46
À : SYLVIE PALLUEL
Objet : RE: RE : [castor-dev] [jdo] Reading, in the same transaction, a data
just created (reading via oql query)



I must admit I am surprised that this is the behaviour you are seeing. I
would have thought that the data would not be written to the database until
the commit phase, otherwise you risk dirty reads (for example if the castor
transaction later rolls back after your JDBC call has accessed the data).

Can you confirm that when you rollback the transaction (instead of
committing) that the data in the database is removed after the rollback(i.e.
not available to either JDBC or OQL pass through)?

Patrick


-----Original Message----- From: SYLVIE PALLUEL [mailto:[EMAIL PROTECTED] Sent: Tue 11/9/2004 3:09 PM To: [EMAIL PROTECTED] Subject: RE : [castor-dev] [jdo] Reading, in the same transaction, a data just created (reading via oql query)


I don't know if this can help you, but I made another test with an OQL pass-thru, and I get the new object before the commit phase.

Is there something special to do to enable the OQL query to see the objects
created inside the current transaction?

Sylvie.

___________________
CREDI RA
Sylvie Palluel

[EMAIL PROTECTED]
___________________



-----Message d'origine-----
De : SYLVIE PALLUEL [mailto:[EMAIL PROTECTED]
Envoyé : mardi 9 novembre 2004 15:26
À : [EMAIL PROTECTED]
Objet : Re: [castor-dev] [jdo] Reading, in the same transaction, a data
just created (reading via oql query)

Hello Patrick,

As I answered to Marco, if my example is simple, the real code is not so
simple!

The program - which is running alone - tries to upgrade the content of a
database which contents application parameters (a new version of the
application will bring many new objects in different "tables", and
modification in some existing objects).

The process may be long, and in fact when we need to read the object, we
have not anymore the object's reference: we have only keywords to retrieve
it from database by an oql query.

If, in the example, I use directly jdbc, and not jdo, the query retrieves
the new object.

You said OQL doesn't go through the cache: that what I thought first, but
if
I try the same thing while modifying an existing object, my oql query
retrieves the modified object!


db.begin(); log.info("Object read via oql "); ArrayList lesDossiers = RequetesJdoAssure.getLesDossiers("GALO", "%", "%", "%", db); for (Iterator iter = lesDossiers.iterator(); iter.hasNext();) { Dossier element = (Dossier) iter.next(); log.info(" Nom = " + element.getNomPatronymique() + " - Prénom = " + element.getPrenom()); log.info(" Modif du prénom"); // The object is modified element.setPrenom("TOTO"); }


log.info(" Object is read again via oql "); lesDossiers = RequetesJdoAssure.getLesDossiers("GALO", "%", "%", "%", db); for (Iterator iter = lesDossiers.iterator(); iter.hasNext();) { Dossier elementModifie = (Dossier) iter.next(); log.info(" Nom Apres modif = " + elementModifie.getNomPatronymique() + " - Prénom après modif = " + elementModifie.getPrenom()); }


So I'm little lost !


Sylvie.

___________________
CREDI RA
Sylvie Palluel

[EMAIL PROTECTED]
___________________



-----Message d'origine-----
De : Patrick van Kann [mailto:[EMAIL PROTECTED]
Envoyé : mardi 9 novembre 2004 14:19
À : [EMAIL PROTECTED]
Objet : RE: [castor-dev] [jdo] Reading, in the same transaction, a data
just created (reading via oql query)

Sylvie,

Your object won't be in the database until you call commit. Because OQL
doesn't go through the cache, it won't find anything unless it is in the
database.

Why do you no longer have the ID? Surely you can get this from the

object

after create()?

Cheers,

Patrick


-----Original Message----- From: SYLVIE PALLUEL [mailto:[EMAIL PROTECTED] Sent: Tue 11/9/2004 12:43 PM To: [EMAIL PROTECTED] Subject: [castor-dev] [jdo] Reading, in the same transaction, a data just created (reading via oql query)

Sorry!
Here's the complete message ...

Hi,

In a transaction (between the db.begin() and the db.commit()), I'm
creating
a new object A .
And then, far away in the code, but in the same transaction, I need to
read
again the object A to create another object B.
To do this, as I have no longer the id, I'm usinq an oql query to

retrieve

A... But it is not found...
What can I do (castor configuration or special command) to be able to

read

it by an oql query ?


db.begin();

log.info(" Creating object dossier via jdo ");
Dossier dossierAjoute = new Dossier();
dossierAjoute.setNomPatronymique("LEGRAND");
dossierAjoute.setPrenom("ALEXANDRE");
dossierAjoute.setCivilite("M");
dossierAjoute.setNumNatident("11111111111");

db.create(dossierAjoute);


log.info(" Reading back the object just created via jdo "); lesDossiers

=

RequetesJdoAssure.getLesDossiers("LEGRAND", "%", "ALEXANDRE", "%", db);
log.info(" Nbre de dossiers = " + lesDossiers.size()); // The result

will

be
0 ... for (Iterator iter = lesDossiers.iterator(); iter.hasNext();) {
   Dossier element = (Dossier) iter.next();
   log.info(" Nom Apres creation = " + element.getNomPatronymique() + "
- Prénom après creation = " + element.getPrenom()); }

// if I had the object if I could do this ..
log.info(" Reading back the object by db.load() ");
Dossier dossier=(Dossier)
db.load(Class.forName("fr.cnam.scapin.metier.donnees.dossiers.Dossier"),
new
Integer(dossierAjoute.getIdDossier()));
// this will be ok
log.info("Dossier relu par db.load " + dossier.toString());

db.rollback();



Thanks for your help.

Sylvie
___________________
CREDI RA
Sylvie Palluel

[EMAIL PROTECTED]
___________________



-----Message d'origine-----
De : SYLVIE PALLUEL [mailto:[EMAIL PROTECTED]
Envoyé : mardi 9 novembre 2004 13:23
À : [EMAIL PROTECTED]
Objet : [castor-dev] [castor-user][jdo] Reading, in the same

transaction,

a data just created (reading via oql query)

Hi,

In a transaction (between the db.begin() and the db.commit()), I'm
creating
a new object A .
And then, far away in the code, but in the same transaction, I need to
read
again the object A to create another object B .
To do this, as I have no longer the id, I'm usinq an oql query to

retrieve

A... But it is not found...
What can I do (castor configuration or special command) to be able to

read

it by an oql query ?

.







------------------------------------------------------------------------

----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
unsubscribe castor-dev

--

Syscon Ingenieurbüro für
Meß- und Datentechnik GmbH
Ralf Joachim
Raiffeisenstraße 11
D-72127 Kusterdingen
Germany

Tel.   +49 7071 3690 52
Mobil: +49 173 9630135
Fax    +49 7071 3690 98

Email: [EMAIL PROTECTED]
Web:   www.syscon-world.de



----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
unsubscribe castor-dev

Reply via email to