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