You can issue the LOCK TABLE statement in your application programs to raise the lock granularity to the table (actually, table space) level. Doing so means that you will not need to take lower level locks (at the page or row level, whichever is in effect for the table space in question). Issuing a LOCK TABLE in a program can make sense in certain, specific circumstances. Consider using the LOCK TABLE statement to control the efficiency of locking in programs that will issue many page/row lock requests when there are no concurrent requests for the same data. Issuing a LOCK TABLE, at times, can be a reasonable alternative to using an ISOLATION level of RR or RS when a large percentage of a table's rows or pages will be modified.
If
your environment can withstand the concurrency hit caused by LOCK TABLE you can
gain performance by reducing locking activity. Taking a larger granularity lock
at the table(space) level instead of multiple page or row locks will improve
the performance of your program, albeit at the expense of concurrent activity
to the data. If you wish to avoid modifying the program you can START the table
space is read only mode (RO) and achieve similar results (no locks are taken
because the data cannot be modified). This can be accomplished using a command
like so:
-START DATABASE(DBNAME)
SPACENAM(SPNAME) ACCESS(RO)
Of
course, if you go that route you will have to make sure that you restart the
table space for read write activity (RW) after the program finishes. This can
be unwieldy to implement.
If,
instead, you wish to use the LOCK TABLE approach, there are two types of LOCK
TABLE requests. The LOCK TABLE...IN SHARE MODE statement acquires an S-lock on
the table specified in the statement. This locking strategy effectively
eliminates the possibility of concurrent modification programs running while
the LOCK TABLE is in effect. The S-lock is obtained on the table space for
tables contained in non-segmented table spaces. This is important to
understand, especially if you have multi-table table spaces.
The LOCK TABLE...IN EXCLUSIVE MODE statement acquires an X-lock on the table specified in the statement. All concurrent processing is suspended until the X-lock is released. Again, for non-seqmented table spaces, the X-lock is obtained on the table space not the table.
In both cases, you can specify the PART parameter to indicate that only a specific partition is to be locked. For example, to lock only the third partition of a partitioned table space, you can issue: LOCK TABLE...PART 3 IN EXCLUSIVE MODE.
The
table locks acquired as a result of the LOCK TABLE statement are held until the
next COMMIT point unless RELEASE(DEALLOCATE) was specified for the plan issuing
the LOCK TABLE statement. In that situation, the lock is held until the program
terminates. That means, for RELEASE(COMMIT) programs, you will need to issue
the LOCK TABLE again after each COMMIT or processing will revert to page/row
locking.
Also,
keep in mind that the lock will not take effect until the statement executes,
even if ACQUIRE(ALLOCATE) was coded at BIND time.
No comments:
Post a Comment