15.9.1. Implementing the store_lock()
Function
The
store_lock()
function is called before any reading or writing is performed.
Before adding the lock into the table lock handler
mysqld calls store lock with the requested
locks. Store lock can modify the lock level, for example change
blocking write lock to non-blocking, ignore the lock (if we
don't want to use MySQL table locks at all) or add locks for
many tables (like we do when we are using a MERGE handler).
Berkeley DB, for example, downgrades blocking table
TL_WRITE
locks to non-blocking
TL_WRITE_ALLOW_WRITE
locks (which signals
that we are doing WRITE
s, but we are still
allowing other readers and writers).
When releasing locks, store_lock()
is also
called. In this case, one usually doesn't have to do anything.
If the argument of store_lock
is
TL_IGNORE
, it means that MySQL requests the
handler to store the same lock level as the last time.
The potential lock types are defined in
includes/thr_lock.h
and are copied here:
enum thr_lock_type
{
TL_IGNORE=-1,
TL_UNLOCK, /* UNLOCK ANY LOCK */
TL_READ, /* Read lock */
TL_READ_WITH_SHARED_LOCKS,
TL_READ_HIGH_PRIORITY, /* High prior. than TL_WRITE. Allow concurrent insert */
TL_READ_NO_INSERT, /* READ, Don't allow concurrent insert */
TL_WRITE_ALLOW_WRITE, /* Write lock, but allow other threads to read / write. */
TL_WRITE_ALLOW_READ, /* Write lock, but allow other threads to read / write. */
TL_WRITE_CONCURRENT_INSERT, /* WRITE lock used by concurrent insert. */
TL_WRITE_DELAYED, /* Write used by INSERT DELAYED. Allows READ locks */
TL_WRITE_LOW_PRIORITY, /* WRITE lock that has lower priority than TL_READ */
TL_WRITE, /* Normal WRITE lock */
TL_WRITE_ONLY /* Abort new lock request with an error */
};
Actual lock handling will vary depending on your locking
implementation and you may choose to implement some or none of
the requested lock types, substituting your own methods as
appropriate. The following is the minimal implementation, for a
storage engine that does not need to downgrade locks:
THR_LOCK_DATA **ha_tina::store_lock(THD *thd,
THR_LOCK_DATA **to,
enum thr_lock_type lock_type)
{
if (lock_type != TL_IGNORE && lock.type == TL_UNLOCK)
lock.type=lock_type;
*to++= &lock;
return to;
}
See also ha_berkeley::store_lock()
and
ha_myisammrg::store_lock()
for a more
complex implementation.