|mode||the locking mode, read or write.|
|lockfile_name||specifies the name of the lockfile to use. Default is $filename.lock. This is useful for locking multiple resources with the same lockfiles.|
|nonblocking||determines if the flock call on the lockfile should block waiting for a lock, or if it should return failure if a lock can not be immediately attained. If nonblocking is set and a lock can not be attained, the tie command will fail. Currently, Im not sure how to differentiate this between a failure form the DB_File layer.|
|lockfile_mode||determines the mode for the sysopen call in opening the lockfile. The default mode will be formulated to allow anyone that can read or write the DB_File permission to read and write the lockfile. (This is because some systems may require that one have write access to a file to lock it for reading, I understand.) The umask will be prevented from applying to this mode.|
To avoid locking problems, realize that it is <B>criticalB> that you release the lock as soon as possible. See the lock as a hot potato, something that you must work with and get rid of as quickly as possible. See the sections of code where you have a lock as critical sections. Make sure that you call untie as soon as possible.
It is often better to write:
Also realize that when acquiring two locks at the same time, a deadlock situation can be caused.
You can enter a deadlock situation if two processes simultaneously try to acquire locks on two separate databases. Each has locked only one of the databases, and cannot continue without locking the second. Yet this will never be freed because it is locked by the other process. If your processes all ask for their DB files in the same order, this situation cannot occur.
There are three locking wrappers for DB_File in CPAN right now. Each one implements locking differently and has different goals in mind. It is therefore worth knowing the difference, so that you can pick the right one for your application.
Here are the three locking wrappers:
Tie::DB_Lock DB_File wrapper which creates copies of the database file for read access, so that you have kind of a multiversioning concurrent read system. However, updates are still serial. Use for databases where reads may be lengthy and consistency problems may occur.
Tie::DB_LockFile DB_File wrapper that has the ability to lock and unlock the database while it is being used. Avoids the tie-before-flock problem by simply re-tie-ing the database when you get or drop a lock. Because of the flexibility in dropping and re-acquiring the lock in the middle of a session, this can be massaged into a system that will work with long updates and/or reads if the application follows the hints in the POD documentation.
DB_File::Lock (this module) extremely lightweight DB_File wrapper that simply flocks a lockfile before tie-ing the database and drops the lock after the untie. Allows one to use the same lockfile for multiple databases to avoid deadlock problems, if desired. Use for databases where updates are reads are quick and simple flock locking semantics are enough.
(This text duplicated in the POD documentation, by the way.)
David Harris <firstname.lastname@example.org>
Helpful insight from Stas Bekman <email@example.com>
|perl v5.20.3||LOCK (3)||2002-04-09|