After diagnosing a lock escalation problem,
the next step is to attempt to resolve the issue resulting from the
database manager automatically escalating locks from row level to
table level. The guidelines provided here can help you to resolve
the lock escalation problem you are experiencing and help you to prevent
such future incidents.
About this task
The
guidelines provided here can help you to resolve the lock escalation
problem you are experiencing and help you to prevent such future incidents.
The objective is to minimize lock escalations, or eliminate
them, if possible. A combination of good application design and database
configuration for lock handling can minimize or eliminate lock escalations.
Lock escalations can lead to reduced concurrency and potential lock
timeouts, so addressing lock escalations is an important task. The lock_escals monitor
element and messages written to the administration notification log
can be used to identify and correct lock escalations.
First,
ensure that lock escalation information is being recorded. Set the
value of the mon_lck_msg_lvl database configuration
parameter to 1. This is the default setting. When
a lock escalation event occurs, information regarding the lock, workload,
application, table, and error SQLCODEs are recorded. The query is
also logged if it is a currently executing dynamic SQL statement.
Procedure
Use the following steps to diagnose the cause of the
unacceptable lock escalation problem and to apply a remedy:
- Gather information from the administration notification
log about all tables whose locks have been escalated and the applications
involved. This log file includes the following information:
- The number of locks currently held
- The number of locks needed before lock escalation is completed
- The table identifier and table name of each table being escalated
- The number of non-table locks currently held
- The new table-level lock to be acquired as part of the escalation.
Usually, an S or X lock is acquired.
- The internal return code that is associated with the acquisition
of the new table-level lock
- Use the administration notification log information about
the applications involved in the lock escalations to decide how to
resolve the escalation problems. Consider the following
options:
- Check and possibly adjust either the maxlocks or locklist database
configuration parameters, or both. In a partitioned database system,
make this change on all database partitions. The value of the locklist configuration
parameter may be too small for your current workload. If multiple
applications are experiencing lock escalation, this could be an indication
that the lock list size needs to be increased. Growth in workloads
or the addition of new applications could cause the lock list to be
too small. If only one application is experiencing lock escalations,
then adjusting the maxlocks configuration parameter
could resolve this. However, you may want to consider increasing locklist at
the same time you increase maxlocks - if one
application is allowed to use more of the lock list, all the other
applications could now exhaust the remaining locks available in the
lock list and experience escalations.
- You might want to consider the isolation level at which the application
and the SQL statements are being run, for example RR, RS, CS, or UR.
RR and RS isolation levels tend to cause more escalations because
locks are held until a COMMIT is issued. CS and UR isolation levels
do not hold locks until a COMMIT is issued, and therefore lock escalations
are less likely. Use the lowest possible isolation level that can
be tolerated by the application.
- Increase the frequency of commits in the application, if business
needs and the design of the application allow this. Increasing the
frequency of commits reduces the number of locks that are held at
any given time. This helps to prevent the application from reaching
the maxlocks value, which triggers a lock escalation,
and helps to prevent all the applications from exhausting the lock
list.
- You can modify the application to acquire table locks using the
LOCK TABLE statement. This is a good strategy for tables where concurrent
access by many applications and users is not critical; for example,
when the application uses a permanent work table (for example, not
a DGTT) that is uniquely named for this instance of the application.
Acquiring table locks would be a good strategy in this case as it
will reduce the number of locks being held by the application and
increase the performance because row locks no longer need to be acquired
and released on the rows that are accessed in the work table.
If
the application does not have work tables and you cannot increase
the values for locklist or maxlocks configuration
parameters, then you can have the application acquire a table lock.
However, care must be taken in choosing the table or tables to lock.
Avoid tables that are accessed by many applications and users because
locking these tables will lead to concurrency problems which can affect
response time, and, in the worst case, can lead to applications experiencing
lock timeouts.
What to do next
Rerun
the application or applications to ensure that the locking problem
has been eliminated by checking the administration notification log
for lock-related entries.
No comments:
Post a Comment