Thread: Issue with now() within a transaction in pg74.213.jdbc.jar

Issue with now() within a transaction in pg74.213.jdbc.jar

From
"John Pagakis"
Date:
Most of my tables have a last update date and during some testing in
Postgres 7.4.1 I noticed that the last_update date was slightly in the past
for anything updated within a transaction.  The amount it is off by seems to
vary: as little as 30 seconds; as much as a couple of minutes.

Tables updated outside of a transaction seem to have an accurate timestamp.
If I setAutoCommit(true) instead of setAutoCommit(false) and comment out my
commit/rollbacks, the timestamp is accurate.  Within a transaction, it is as
though I have set the WayBack machine for a random trip 1/2 - 2 minutes back
in time.

I am using pg74.213.jdbc.jar.  Is there a more current driver?

Has anyone else noticed this?  Is anyone looking at it?

__________________________________________________________________
John Pagakis
Email: ih8spam_thebfh@toolsmythe.com
remove the ih8spam_ and you'll find me

"I don't know the meaning of the word
 surrender!  I mean I know it, I'm not
 dumb, just not in this context."
        -- The Tick

This signature generated by
     ... and I Quote!!(tm) Copyright (c) 1999 SpaZmodic Frog Software, Inc.
                                              www.spazmodicfrog.com


Re: Issue with now() within a transaction in

From
Dave Cramer
Date:
this has nothing to do with jdbc, it is more to do with the way now() is
determined. From your explanation it is determined at the end of the
transaction, or when the transaction is committed.

Dave
On Thu, 2004-07-01 at 17:47, John Pagakis wrote:
> Most of my tables have a last update date and during some testing in
> Postgres 7.4.1 I noticed that the last_update date was slightly in the past
> for anything updated within a transaction.  The amount it is off by seems to
> vary: as little as 30 seconds; as much as a couple of minutes.
>
> Tables updated outside of a transaction seem to have an accurate timestamp.
> If I setAutoCommit(true) instead of setAutoCommit(false) and comment out my
> commit/rollbacks, the timestamp is accurate.  Within a transaction, it is as
> though I have set the WayBack machine for a random trip 1/2 - 2 minutes back
> in time.
>
> I am using pg74.213.jdbc.jar.  Is there a more current driver?
>
> Has anyone else noticed this?  Is anyone looking at it?
>
> __________________________________________________________________
> John Pagakis
> Email: ih8spam_thebfh@toolsmythe.com
> remove the ih8spam_ and you'll find me
>
> "I don't know the meaning of the word
>  surrender!  I mean I know it, I'm not
>  dumb, just not in this context."
>         -- The Tick
>
> This signature generated by
>      ... and I Quote!!(tm) Copyright (c) 1999 SpaZmodic Frog Software, Inc.
>                                               www.spazmodicfrog.com
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org
>
--
Dave Cramer
519 939 0336
ICQ # 14675561


Re: Issue with now() within a transaction in pg74.213.jdbc.jar

From
Oliver Jowett
Date:
John Pagakis wrote:
> Most of my tables have a last update date and during some testing in
> Postgres 7.4.1 I noticed that the last_update date was slightly in the past
> for anything updated within a transaction.  The amount it is off by seems to
> vary: as little as 30 seconds; as much as a couple of minutes.
>
> Tables updated outside of a transaction seem to have an accurate timestamp.
> If I setAutoCommit(true) instead of setAutoCommit(false) and comment out my
> commit/rollbacks, the timestamp is accurate.  Within a transaction, it is as
> though I have set the WayBack machine for a random trip 1/2 - 2 minutes back
> in time.
>
> I am using pg74.213.jdbc.jar.  Is there a more current driver?
>
> Has anyone else noticed this?  Is anyone looking at it?

Older drivers issue a BEGIN immediately after the previous transaction
commits or rollbacks. This freezes the value of now() at that point. It
also manifests as idle backends being "idle in transaction" all the time.

Upgrade to a more recent driver. Current CVS should be fine against a
7.4 server. See http://jdbc.postgresql.org

-o

Re: Issue with now() within a transaction in pg74.213.jdbc.jar

From
Kris Jurka
Date:

On Thu, 1 Jul 2004, John Pagakis wrote:

> Most of my tables have a last update date and during some testing in
> Postgres 7.4.1 I noticed that the last_update date was slightly in the past
> for anything updated within a transaction.  The amount it is off by seems to
> vary: as little as 30 seconds; as much as a couple of minutes.
>

This is not a JDBC issue.  now() always returns the time from the start of
the transaction.  If you want current wall clock time use timeofday().

Kris Jurka

Re: Issue with now() within a transaction in pg74.213.jdbc.jar

From
"John Pagakis"
Date:
Kris (sorry for the second copy; forgot to cc pgsql-jdbc@postgresql.org with
this)  -

That did it.  Thanks so much!!

Odd though.  There seems to be a bug in the cygwin implementation of
postgres.  Tim McAuley ran into the same problem I did and posted here:

http://groups.google.com/groups?q=cast+timeofday+timestamp&hl=en&lr=&ie=UTF-
8&selm=bgdif2%2414kk%241%40FreeBSD.csie.NCTU.edu.tw&rnum=5

To save you from having to follow the link - an attempt to cast TIMEOFDAY()
to TIMESTAMP in cygwin's implementation results in:

ERROR:  Bad timestamp external representation 'Thu Jul 01 22:29:25.402375
2004 USMST'



Here's what I did to get around it.  Perhaps someone out there has a more
elegant solution (and if so I'm all ears because I hate this hack):

SELECT CAST( SUBSTRING( TIMEOFDAY() FROM 1 FOR 31 ) AS TIMESTAMP );



It looks like the CAST problem is a cygwin-only issue.

Thanks again Kris!!

__________________________________________________________________
John Pagakis
Email: ih8spam_thebfh@toolsmythe.com
remove the ih8spam_ and you'll find me


"Think enough and you won't know anything."
        -- Kenneth Patchen

This signature generated by
     ... and I Quote!!(tm) Copyright (c) 1999 SpaZmodic Frog Software, Inc.
                                              www.spazmodicfrog.com


-----Original Message-----
From: pgsql-jdbc-owner@postgresql.org
[mailto:pgsql-jdbc-owner@postgresql.org]On Behalf Of Kris Jurka
Sent: Thursday, July 01, 2004 4:58 PM
To: John Pagakis
Cc: pgsql-jdbc@postgresql.org
Subject: Re: [JDBC] Issue with now() within a transaction in
pg74.213.jdbc.jar




On Thu, 1 Jul 2004, John Pagakis wrote:

> Most of my tables have a last update date and during some testing in
> Postgres 7.4.1 I noticed that the last_update date was slightly in the
past
> for anything updated within a transaction.  The amount it is off by seems
to
> vary: as little as 30 seconds; as much as a couple of minutes.
>

This is not a JDBC issue.  now() always returns the time from the start of
the transaction.  If you want current wall clock time use timeofday().

Kris Jurka

---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
      subscribe-nomail command to majordomo@postgresql.org so that your
      message can get through to the mailing list cleanly


Re: Issue with now() within a transaction in pg74.213.jdbc.jar

From
Kris Jurka
Date:

On Thu, 1 Jul 2004, John Pagakis wrote:

> Odd though.  There seems to be a bug in the cygwin implementation of
> postgres.  Tim McAuley ran into the same problem I did and posted here:
>
> http://groups.google.com/groups?q=cast+timeofday+timestamp&hl=en&lr=&ie=UTF-
> 8&selm=bgdif2%2414kk%241%40FreeBSD.csie.NCTU.edu.tw&rnum=5
>
> To save you from having to follow the link - an attempt to cast TIMEOFDAY()
> to TIMESTAMP in cygwin's implementation results in:
>
> ERROR:  Bad timestamp external representation 'Thu Jul 01 22:29:25.402375
> 2004 USMST'
>

Well the JDBC list isn't the best place to get help on this, but I don't
see a problem here, so I imagine it is dependent on your timezone.  (I'm
PDT).  Postgresql has some confusion on timezone names because it has an
internal list of timezones, but also uses the system libraries to
manipulate them as well.  This will be rectified in 7.5 when all timezone
handling is moved under the control of postgresql libraries, but for now I
will note that USMST does not appear in src/backend/utils/adt/datetime.c.

Also notice that the original bug report you cite shows different timezone
results for timeofday.  cygwin shows GMTDT while linux shows IST.
Checking datetime.c again IST is included, but GMTDT is not.

Kris Jurka