Today I am introducing a new series of blog posts here on misunderstood DB2 features and functions. But before I start this blog post I want to emphasize
that this is just my opinion. I’m sure many of you have your own ideas of the
DB2 features that are most misunderstood. But please, take a moment to consider
my thoughts here… and then share your own in the comments section below!
Locking!
One
of the most misunderstood features of
DB2 is how locking works. This is probably to be expected because database locking
is a rather complex topic and it is constantly morphing with each and every new
version of DB2.
First
of all you have to understand the lock options available and how DB2 locks at
each level: table space, table, page and row. You need to understand share and
exclusive locks and that the manner in which DB2 takes them depends upon the
SQL statements you issue, the program bind options you choose, and even, in
some cases, the DDL options you’ve chosen.
And more. What about claims and drains? Do you know the different between locks and latches? What about the difference between lock suspension, timeouts, and deadlocks?
And more. What about claims and drains? Do you know the different between locks and latches? What about the difference between lock suspension, timeouts, and deadlocks?
Then
there is the whole issue of lock avoidance and what that means. I visit a lot
of shops each year and I still see a lot of ambiguous cursors. Simply adding
FOR READ ONLY to all of the cursors in your program where you will not be
modifying the data can make a world of performance difference because DB2 can
avoid locking.
There
is also the frequently-ignored need for a commit strategy. Every batch program
should have a commit strategy implemented whereby modifications are committed to
the database and locks are released. Failing to do this causes other programs
to timeout waiting for locks. I wrote about this in the past and I call it
Bachelor Programming Syndrome.
Another
locking issue is the whole dirty read everywhere problem. Programmers learn
that they can improve performance by adding WITH UR to the end of their SQL statements
in their programs. UR, Uncommitted Read – aka dirty read, causes DB2 to not
take locks. But that can cause problems because the program is reading
uncommitted data – and that data it is reading may never actually exist in the
database (it could be rolled back) and may not be consistent because it is not reading
only committed units of work. I’ve visited shops that use WITH UR everywhere
and they insist that they have not encountered any problems. To which I always add, “…yet.”
Then
there are the new features added in the last few releases of DB2, including improved lock efficiencies when accessing the DB2 Catalog, the ability to access currently
committed data, optimistic locking, skipping locked data, and more.
Summary
Yes,
it is easy to misunderstand locking, and many do so. Taking the time to bolster
your knowledge of how DB2 locks, the locking options available, and how they
work can do you and your shop a world of good.
And
be sure to check back here for future blogs about misunderstood DB2 features!