Re: [JDBC] Trouble with locking tables - reg.

From: Dave Cramer <pg(at)fastcrypt(dot)com>
To: Shanmugasundaram Doraisamy <shan(at)ceedees(dot)com>
Cc: "pgsql-jdbc(at)postgresql(dot)org" <pgsql-jdbc(at)postgresql(dot)org>, "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org>, pgsql-admin(at)postgresql(dot)org
Subject: Re: [JDBC] Trouble with locking tables - reg.
Date: 2004-06-10 16:36:02
Message-ID: 1086885362.5639.183.camel@localhost.localdomain
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-admin pgsql-general pgsql-jdbc

Functions can't have transactions inside of them

You need to start the transaction then call the function.

couple of questions though

why not use sequences ? Then you have no concurrency issues. They are
guaranteed to be incremented.

Also you can use select for update, instead of locking the entire table.

Dave
On Wed, 2004-06-09 at 23:39, Shanmugasundaram Doraisamy wrote:
> Dear Group,
> We are using Postgresql 7.3.4 on Redhat 8.0 with
> Java 1.4.2. We are developing our applications in Java. We call stored
> procedures from the java program. Order numbers are generated by many
> departments in the Hospital. We manitain a single table from which to
> select the order number. The way this works is that the order numbers
> are released for reuse if the order has been completed. We wrote a
> procedure in plpgsql with a transaction which locks the table for
> concurrency problem. When more than one person tries to generate an
> order number (by running the java program) still there arise the
> concurrency problem.
>
> We tried to check how the procedures with transaction that
> locks the table works . what we did to check the procedure was as follows
> we have one database server.
> we took two computer systems. in both system we opened
> one terminal (linux).
> let the value of the order number be 50.
> [1] in one system's terminal we started the transaction
> using begin; lock table <table name>;
> [2] in another system we run the procedure which fetch
> the order number from the locked table ,display it -increment it - store
> it in the table again using update statement (not like order number =
> order number + 1) but like (x =order number +1), again we fetched the
> value of the order number from the table and display it . the procedure
> is as follows:
>
> CREATE OR REPLACE FUNCTION CHECKING() RETURNS TEXT AS'
> DECLARE
> XVAL INTEGER;
> BEGIN
> BEGIN
> LOCK TABLE CHECKING_LOCK;
> SELECT INTO XVAL X FROM CHECKING_LOCK WHERE Y = TRUE;
> RAISE NOTICE ''X BEF %'',XVAL;
> XVAL := XVAL + 1;
> UPDATE CHECKING_LOCK SET X = XVAL WHERE Y = TRUE;
> SELECT INTO XVAL X FROM CHECKING_LOCK WHERE Y = TRUE;
> RAISE NOTICE ''X AFT %'',XVAL;
> END;
> RETURN ''OK'';
> END;
> 'LANGUAGE 'PLPGSQL';
>
> Now this procedure waits for the other transaction to complete
> [3] in the other system's terminal i update the field value -
> increment it by 1 and entered end; to commit the transaction
> [4] automatically the procedure runs and displays the result
> As per transaction isolation level ( read committed being the
> default isolation level) it should be 51 and 52.
> as when the transaction in the terminal update it to 51 , the
> transaction in the procedure which was waiting should fetch it as 51 and
> increment it by 1 (52) and set the field value to 52 and when fetched
> after update should return it the value as 52. this is what we want.
> but what is the actual is ,
> The final result the procedure displays is 50 before update and 50
> after update.
> when i verified in the database table it shows the field value as
> 51.
> how to make it to our expectation.
>
> Your immediate response in this regard is very much appreciate.
> Thanking you,
>
> Yours sincerely,
>
> Shan.
>
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
> (send "unregister YourEmailAddressHere" to majordomo(at)postgresql(dot)org)
>
>
>
> !DSPAM:40c88c0d60177625298691!
>
>
--
Dave Cramer
519 939 0336
ICQ # 14675561

In response to

Browse pgsql-admin by date

  From Date Subject
Next Message Tom Lane 2004-06-10 18:47:13 Re: pg_stat tables empty
Previous Message Naomi Walker 2004-06-10 15:42:33 Re: "select * from groupes" didn't display any data

Browse pgsql-general by date

  From Date Subject
Next Message Mr sidh bhatt 2004-06-10 16:45:12 Returning rowsets/results from a function to another one in plpgsl.
Previous Message mike 2004-06-10 16:27:25 Re: FK issue

Browse pgsql-jdbc by date

  From Date Subject
Next Message sathish 2004-06-11 09:44:07 doubt
Previous Message Bruce Momjian 2004-06-10 04:11:26 Re: Nested transactions