Hi everyone,

I am running 'PostgreSQL 9.1.4, compiled by Visual 
C++ build 1500, 64-bit' on a Windows Server and I am having some Locking
 issues. Maybe anyone can let me know what is wrong with my example:



Imagine that we have two tables (t_users and t_records)

 

t_users contains 1 row per each user

t_records is a regular transactional table which contains a
field userid with the user that created/updated the row.

 

CREATE TABLE
t_users(userid        VARCHAR(10),

                    
loginattempts INTEGER,

                    
CONSTRAINT pk_t_users PRIMARY KEY (userid));

 

CREATE TABLE
t_records(recordid    INTEGER,

                      
description VARCHAR(100),

                      
userid      VARCHAR(10)

    
                  REFERENCES
t_users(userid) MATCH SIMPLE

                      
ON UPDATE NO ACTION ON DELETE NO ACTION);

                 


INSERT INTO t_users (userid,
loginattempts) VALUES ('andrew',0);


 

 The user logs in and starts a
background process that contains a long TRANSACTION which
updates/inserts rows in t_records with the user's
id.  This process keeps the transaction
open for 1 hour while it works with code like:

                  


/* Session #1 */

BEGIN TRANSACTION

 

/* Big loop */

INSERT INTO t_records (recordid,
description, userid) VALUES (1,'Record #1','andrew');

 

/*… SOME CODE HERE */

 /*.... */


 

/* Once the loop ends, it will COMMIT/ROLLBACK  the transaction */

ROLLBACK
/ COMMIT


/* END of Session #1 */

 


The user logs out and then tries
to log back in after 30 minutes.  The login hangs because we are not be able to 
update records on t_user  (for
userids used on Session#1 ) until the transaction on Session#1 is done:

 

/* SESSION #2 */

 

UPDATE t_users  SET
loginattempts = 1 WHERE userid = 'andrew'

 

/*END SESSION #2*/




 Any comments or feedback will be appreciated.
Regards,
Andrew Jaimes
                                          

Reply via email to