I am working on a project that involves displaying locking information about 
each lock taken, whether it be a row level or  table leve llock.
When dealing with struct LOCK (src/include/storage) i have noticed that 
postgreSQL creates a single LOCK  struct for each table in the  db. Like if 
i acquire 2 seperate row level locks on 2 seperate rows, both these locks 
are represented in the same struct LOCK datastructure . And if i acquire a 
table level lock on this table, then all 3 locks information( 2 row level 
locks and 1 table level lock) is recorded in the same LOCK datastructure. I 
would think that there should be 3 different LOCK datastructres created in 
postgreSQL for the above example.
IS there are reason why only one LOCK datastructures is created in such a 
case?
for the purposes of my project i need to seperate out these 3 locks and 
present them as 3 distinct locked objects. i was using the LockData(defined 
in src/include/storage/lock.h ) datastructures for this, but if all 3 locks 
are put into the same LOCK struct even in LOCKDATA then can someone help me 
as to how else i can accomplish what i intent on doing?
thank you very much
Jenny

_________________________________________________________________
Compare Cable, DSL or Satellite plans: As low as $29.95.  
https://broadband.msn.com


Thu, 04 Sep 2003 08:56:31 -0700
"Jenny -" <nat_lazy@hotmail.com>
tablelevel and rowlevel locks
On Thu, Sep 04, 2003 at 08:56:31AM -0700, Jenny - wrote:
> I am working on a project that involves displaying locking information 
> about each lock taken, whether it be a row level or  table leve llock.
> When dealing with struct LOCK (src/include/storage) i have noticed that 
> postgreSQL creates a single LOCK  struct for each table in the  db. Like if 
> i acquire 2 seperate row level locks on 2 seperate rows, both these locks 
> are represented in the same struct LOCK datastructure.

I think the locks would actually by represented by PROCLOCK structures.
The LOCK structures are for lockable objects, not for actual locks.

-- 
Alvaro Herrera (<alvherre[@]dcc.uchile.cl>)
"Vivir y dejar de vivir son soluciones imaginarias.
La existencia est� en otra parte" (Andre Breton)

Thu, 4 Sep 2003 12:10:16 -0400
Alvaro Herrera Munoz <alvherre@dcc.uchile.cl>
Re: [HACKERS] tablelevel and rowlevel locks
[ pgsql-general removed from cc list, as this is quite inappropriate
there ]

"Jenny -" <nat_lazy@hotmail.com> writes:
> I am working on a project that involves displaying locking information about 
> each lock taken, whether it be a row level or  table leve llock.
> When dealing with struct LOCK (src/include/storage) i have noticed that 
> postgreSQL creates a single LOCK  struct for each table in the  db. Like if 
> i acquire 2 seperate row level locks on 2 seperate rows, both these locks 
> are represented in the same struct LOCK datastructure .

As has been pointed out to you several times already, the LOCK
structures aren't used for row-level locks.  The objects that you are
looking at represent table-level locks.  For example, after
	BEGIN;
	SELECT * FROM foo WHERE id IN (1,2) FOR UPDATE;

there will be a table-level AccessShareLock on "foo" that was acquired
(and not released) by the SELECT statement as a whole.  If there
actually were rows matching the WHERE clause, the locks on them are
represented by modifying their tuple headers on-disk.  There is nothing
about individual rows in the LOCK table.

Now, if you have modified the code with the intention of creating LOCK
entries for row-level locks, then all I can say is you didn't do it
right.  The LockTag created to represent a row-level lock should be
distinct from a table-level LockTag (or a page-level LockTag for that
matter).  If it is, the hash table will definitely store it as a
separate object.

			regards, tom lane

Thu, 04 Sep 2003 19:08:01 -0400
Tom Lane <tgl@sss.pgh.pa.us>
Re: tablelevel and rowlevel locks 