Another way is to keep another unique value inside the table to be updated
and remember it.
When needed, I add a second unique column to the table (in my case a
char(64)) which is filled with the current timestamp and some md5 checksum.
I select this value before the update, pass it along with the HTML form,
and, before updating, I re-select the row to be updated and compare the
keys. If the comparision fails, the user is presented a warning message,
else I do the update (the user's data and a new generated stamp-value) with
the primary key _and_ the original stamp in the where clause. Then I check
if my new stamp made it to the table, or present another warning.
A sample:
Table atable:
id int not null primary key
stamp char(64) not null unique
avalue int
select id,stamp,avalue from atable where id=1 (select data for update)
build html form with "id" and "stamp" as hidden values
select stamp from atable where id=<the_id>
if stamp(form) != stamp(db)
error (e.g. start from beginning)
else
construct new_stamp
update atable set avalue=<new>,stamp=<new_stamp> where id=<the_id> AND
stamp=<old_stamp>
select stamp from atable where id=<the_id>
if stamp(db) != <new_stamp>
error
endif
endif
It's a bit of work, but it had never let me down.
Thomas
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
Is what I use in the WHERE clause to update data
ts CHAR(32) NOT NULL UNIQUE
I
> -----Ursprüngliche Nachricht-----
> Von: Doug Semig [mailto:[EMAIL PROTECTED]]
> Gesendet: Mittwoch, 18. April 2001 20:48
> An: [EMAIL PROTECTED]
> Betreff: Re: [PHP-DB] Concurrent update to database (PostgreSQL or
> MySQL) ??
>
>
> As others have mentioned, this is a tricky thing to do.
>
> What others haven't mentioned is a way to do it.
>
> Let's say you just showed the update form to two users. It
> contains the
> fields that they are allowed to update and the values in
> those fields had
> been retreived from the database.
>
> Both users see a form like this:
>
> Today's High Temperature
> ------------------------
> City: Detroit
> Temp (degrees F): 47
>
> ( Submit )
>
> The city field is not available for update (presumably the editor/user
> selected it off of a previous menu), and their task is to
> update today's
> high temperature for Detroit. One of the editors has
> information that the
> high temperature reached 49 degrees F, and the other editor
> has information
> that the high temperature has reached 50. (Perhaps one of
> the editors is
> overworked and hadn't gotten to enter the new high, or the
> temperature is
> changing very quickly.)
>
> So one of the people enter 50 and the other enters 49. Both
> hit submit.
>
> What needs to be done right at that moment to protect it from
> changing the
> value to 50 degrees (which is the correct, most recent, data) and then
> immediately changing the value to 49 degrees (which is now
> out of date)?
>
> Basically, you have to pass the original value to the script
> that is the
> ACTION of the HTML form. This way, you have the original
> value that may
> have been updated and the new value.
>
> The first thing the HTML form's ACTION script has to do is
> get the record
> from the database again. (Use SELECT ... FOR UPDATE if
> available, so the
> RDBMS might lock the row.) If the value you get from the
> SELECT is the
> same as the original value, go ahead and run the UPDATE to
> change the value
> to the new value. If not, then generate and display a screen
> telling the
> editor that the value has been updated by someone else...you
> can show the
> value and ask if they want to proceed with the update, but
> that's all up to
> you and/or your interface designers.
>
> This is all similar to how folks design old fashioned screen-oriented
> database systems (like with CICS).
>
> Good luck,
> Doug
>
> At 01:47 PM 4/18/01 +0200, Nicolas Guilhot wrote:
> >Hi,
> >
> >How can I avoid two or more users to update the same record
> at the same time
> >?
> >
> >Ideally, I would like to lock the record when a user open it for
> >modification. So if another user try to open the same record
> he'll be warned
> >or get record values as read only. Is this possible and how
> to do it with
> >PHP ?? How can I know that the user that has locked the
> record has finished
> >with it, if he never commits his changes ? Is there an FAQ
> about this ?
> >
> >Regards,
> >
> >Nicolas
> >
>
>
>
> --
> PHP Database Mailing List (http://www.php.net/)
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> To contact the list administrators, e-mail:
> [EMAIL PROTECTED]
>
>
--
PHP Database Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]