1
0
mirror of synced 2025-01-18 06:21:40 +03:00

[romanb] Added a first documentation for the Locking Manager component

This commit is contained in:
doctrine 2006-07-24 17:25:24 +00:00
parent 3056d9daa5
commit 990548d315
7 changed files with 94 additions and 2 deletions

View File

@ -0,0 +1,57 @@
At the page where the lock is requested...
<?php
// Get a locking manager instance
$lockingMngr = new Doctrine_Locking_Manager_Pessimistic();
try
{
// Ensure that old locks which timed out are released before we try to acquire our lock
$lockingMngr->releaseAgedLocks(300); // 300 seconds = 5 minutes timeout
// Try to get the lock on a record
$gotLock = $lockingMngr->getLock(
$myRecordToLock, // The record to lock. This can be any Doctrine_Record
'Bart Simpson' // The unique identifier of the user who is trying to get the lock
);
if($gotLock)
{
echo "Got lock!";
// ... proceed
}
else
{
echo "Sorry, someone else is currently working on this record";
}
}
catch(Doctrine_Locking_Exception $dle)
{
echo $dle->getMessage();
// handle the error
}
?>
At the page where the transaction finishes...
<?php
// Get a locking manager instance
$lockingMngr = new Doctrine_Locking_Manager_Pessimistic();
try
{
if($lockingMngr->releaseLock($myRecordToUnlock, 'Bart Simpson'))
{
echo "Lock released";
}
else
{
echo "Record was not locked. No locks released.";
}
}
catch(Doctrine_Locking_Exception $dle)
{
echo $dle->getMessage();
// handle the error
}
?>

View File

@ -0,0 +1 @@
The following code snippet demonstrates the use of Doctrine's pessimistic offline locking capabilities.

View File

@ -0,0 +1,23 @@
[<b>Note</b>: The term 'Transaction' doesnt refer to database transactions here but to the general meaning of this term]<br />
[<b>Note</b>: This component is in <b>Alpha State</b>]<br />
<br />
Locking is a mechanism to control concurrency. The two most well known locking strategies
are optimistic and pessimistic locking. The following is a short description of these
two strategies from which only pessimistic locking is currently supported by Doctrine.<br />
<br />
<b>Optimistic Locking:</b><br />
The state/version of the object(s) is noted when the transaction begins.
When the transaction finishes the noted state/version of the participating objects is compared
to the current state/version. When the states/versions differ the objects have been modified
by another transaction and the current transaction should fail.
This approach is called 'optimistic' because it is assumed that it is unlikely that several users
will participate in transactions on the same objects at the same time.<br />
<br />
<b>Pessimistic Locking:</b><br />
The objects that need to participate in the transaction are locked at the moment
the user starts the transaction. No other user can start a transaction that operates on these objects
while the locks are active. This ensures that the user who starts the transaction can be sure that
noone else modifies the same objects until he has finished his work.<br />
<br />
Doctrine's pessimistic offline locking capabilities can be used to control concurrency during actions or procedures
that take several HTTP request and response cycles and/or a lot of time to complete.

View File

@ -0,0 +1,2 @@
Roman Borschel - romanb at #doctrine (freenode)<br />
Don't hesitate to contact me if you have questions, ideas, ect.

View File

@ -0,0 +1,2 @@
- Possibility to release locks of a specific Record type (i.e. releasing all locks on 'User'
objects).

View File

@ -0,0 +1,5 @@
The pessimistic offline locking manager stores the locks in the database (therefore 'offline').
The required locking table is automatically created when you try to instantiate an instance
of the manager and the ATTR_CREATE_TABLES is set to TRUE.
This behaviour may change in the future to provide a centralised and consistent table creation
procedure for installation purposes.

View File

@ -241,8 +241,10 @@ $menu = array("Getting started" =>
"Locking Manager" => array( "Locking Manager" => array(
"Introduction", "Introduction",
"Pessimistic locking", "Examples",
"Examples"), "Planned",
"Technical Details",
"Maintainer"),
/** /**
"Debugger" => array( "Debugger" => array(
"Introduction", "Introduction",