In this process, there are 2 approaches, quite different
.
What I think is very frustrating is to  fill up a form (can be long),
and find out that your time is lost because someone was quicker than
you to post.
The other approach is to implement a "lock" mechanisms (I know it can
be quite complex, mainly if the user shut down the computer etc ..but
can be handled), to avoid other people being able to get a record for
modifying when someone else can possibly modify it before you do ...

A part from this, I did not try your solution, but seems to handle the
case, maybe a bit costive thought. Using the security component can
avoid people to post after a certain time .. a way to explore ...

hth


On Jun 24, 4:06 pm, Marc MENDEZ <[EMAIL PROTECTED]> wrote:
> Hi,
>
> I asked a few days ago how to handled concurrency with Cake. Thanks to
> some members of this group, examples and time, I have a possible solution.
> However, I need your experience to validate this solution.
>
> I want to warn users when a record they save was modified in the
> meanwhile by somebody else.
> I add a datetime column in the table called "tst" (I can't use
> "modified" column, 'cause the value of this column seems to be updated
> before the callback 'beforeSave'... and of course, I use beforeSave
> method !).
> On the beforeSave(), I start a transaction and lock "for update" the
> record. Then I compare the tst value with the value I retrieved. If it's
> the same, I go on and update the tst value with the current datetime. If
> not, I halt the process with an error.
> I must add in my view $form->hidden("model.tst").
> I should do the same kind of process on beforeDelete()
> If a deadlock or timeout occurs, I handle these errors somewhere else.
>
> Any opinion ? A way to improve it ?
>
> Thanks !
>
> function beforeSave()
>     {
>         foreach ($this->data as $key=>$value)
>         {
>             if (!isset($value['tst']))
>             {
>                 continue;
>             }
>             $pkValue = $this->id;
>             $pkCol = $this->primaryKey;
>             $pkType = $this->getColumnType($this->primaryKey);
>             $db =& ConnectionManager::getDataSource($this->useDbConfig);
>             $db->begin($this);
>             $sql = "SELECT tst FROM " . $this->table . " WHERE " .
> $pkCol . " = ";
>             switch ($pkType) {
>                 case 'integer': // TODO : add other numeric type
>                     break;
>                 default:
>                     $pkValue = "'".$pkValue."'";
>                 break;
>             }
>
>             $sql.=$pkValue. " FOR UPDATE";
>             $modifiedInDB = $this->query($sql);
>             if (!count($modifiedInDB))
>             {
>                // Record deleted
>                 $this->WWsetSqlErrMsg("Enregistrement déjà supprimé");
>                 $db->rollback($this);
>                 return false;
>             }
>             if ($modifiedInDB[0][$this->table]['tst'] != $value['tst'])
>             {
>                 // Record deleted by somebody else
>                 $this->WWsetSqlErrMsg("Enregistrement modifié par un
> autre utilisateur");
>                 $db->rollback($this);
>                 return false;
>             }
>             else
>             {
>                 $this->set('tst',date("Y-m-d G:i:s",strtotime('now')));
>             }
>         }
>         return true;
>     }
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"CakePHP" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/cake-php?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to