Hi

Better to use an integer rather than a date field as 2 simultaneous
transactions can still occur on the same second; most date time fields
are accurate only to the nearest second.

Regards, John

Frank Flynn <[EMAIL PROTECTED]> wrote in message
[EMAIL PROTECTED]">news:[EMAIL PROTECTED]...
> Are you guys interested in yet another solution?  It simular but I think
> it's even easier if that's an incentive...
>
> -In your table do put a datetime field, I'll call it lastMod.  This will
be
> the "last updated" date and time (you need time here)
>
> -In your form have this as a hidden field so it gets submitted with the
rest
> of the data.
>
> -When you receive the data to update the record you have I presume the
> record ID in $id and the last modified date timein $lastMod.  Create a new
> $now with today's date and the current time
>
> Your SQL will look like:
>
> UPDATE Foo
>  SET  col1 = $col1,
>       col2 = $col2,
>       col3 = $col3,
>    lastMod = $now
>  WHERE recordID = $id
>    AND lastMod = $lastMod
>
> As you can see the will succeed only if lastMod has not been changed.  And
> if it had been updated it will not fail (it's perfectly valid SQL) but
will
> not update any records.
>
> -Now to check if you did update the record...
>
>   SELECT lastMod
>     FROM Foo
>     WHERE recordID = $id
>
> And compare this to your $now value.
>
> Or in MS SQL you can check the @@rowcount variable - (that's a MS SQL
value)
> it will be 1 - success or 0 - collision (if it's > 1 you've got duplicate
> ID's).
>
> This has some disadvantage in that your end used could go through all the
> effort to update a record only to have their update fail - I suggest
putting
> a nice error message and refresh the values in the form with the current
> ones.
>
> It has the advantage of avoiding locking, setting flags, rolling back, you
> only need to compare one field and more work for you - and it will always
> work.
>
> Good Luck,
> Frank
>
> On 2/1/02 12:42 PM, "[EMAIL PROTECTED]"
> <[EMAIL PROTECTED]> wrote:
>
> > From: "Peter Lovatt" <[EMAIL PROTECTED]>
> > Date: Fri, 1 Feb 2002 08:09:56 -0000
> > To: <[EMAIL PROTECTED]>, <[EMAIL PROTECTED]>
> > Subject: RE: [PHP-DB] Ensuring users don't overwrite each other (NOT a
newbie
> > question)
> >
> >
> > Hi
> >
> > Interesting problem! Systems would be so much easier to build if we
didn't
> > have to allow for users :)
> >
> > Two suggestions, depending on how you want the data dealt with.
> >
> > A table of rows in use, with a time stamp and an owner. When user1 opens
the
> > record, stamp it with owner and time. If user2 wants to use the record,
> > check when it was 'locked' and apply a timeout based on how long it
takes to
> > edit. For example if the record was opened 3 mins ago, and the timeout
is 5,
> > the user2 gets a message saying 'Record in use try again in 2 minutes'
If it
> > was opened 6 minutes ago set the owner of the locked record to user2,
and
> > reset the timestamp.
> >
> > If / when user1 submits, refuse the update, and inform user1, and
whatever
> > handing you need after that.
> >
> > If no user2 has tried to open the record, then user1 can still submit,
> > because they still own it, even if there is a timeout.
> >
> > If you are feeling flash maybe a JavaScript timer that pops up 1 minute
> > before timeout and warns user1 to save (update record and reload for
more
> > editing)?
> >
> > Probably more hassle than its worth, but you could also take a snapshot
of
> > the data, when user1 starts, and if more than one user tries to edit the
> > record, save the updates in a temp table, compare the updated record
with
> > the original snapshot, and do some sort of intelligent amalgamation.
> >
> > HTH
> >
> > Peter
> >
> >
> >> -----Original Message-----
> >> From: Oliver Cronk [mailto:[EMAIL PROTECTED]]
> >> Sent: 31 January 2002 23:09
> >> To: [EMAIL PROTECTED]
> >> Subject: [PHP-DB] Ensuring users don't overwrite each other (NOT a
> >> newbie question)
> >>
> >>
> >>
> >> Hi there, currently writing an e-CRM system for an intranet using PHP
on
> >> Win32 and MS-SQL.  This system needs to be scalable but more
importantly
> >> there will be anything up to 400 users (unlikely, but the max
> >> amount) using
> >> the same records (updating information about customers etc) and I
> >> worry that
> >> whilst one user has a form open (via one of my PHP scripts) that
another
> >> user could also be making changes to the same record and if they post
it
> >> before the other one they could overwite each others changes.  For
info:
> >> database is normalised to 3NF so that side of things should be okay.
> >>
> >> I have thought of a couple of solutions:
> >>
> >> Row Locking when a user has a record - and if another user wants
> >> to use that
> >> record PHP tells them its in use.  But if the forst user doesn't make
any
> >> changes how will the db know to unlock the row and there might be
> >> potential
> >> deadlock issues.  Also I'm not sure of the SQL for row locking
> >> (do you use a
> >> SELECT with a ROWLOCK hint?).
> >>
> >> Another idea was to have a log or temp table - that would get written
into
> >> when ever some opens a record but this has the same issues as the first
> >> solution I think.
> >>
> >> An another idea is T-SQL and transactions but I'm not sure if that will
> >> solve the problem (and I've never used T-SQL before - therefore
> >> I'm not sure
> >> of its capabilities)
> >> eg:
> >> When the script is started by the first user (to bring up the existing
> >> record) perhaps a transaction is started (if they can persist between
> >> batches?):
> >>
> >> $tranname = "@tran".$id;
> >> $sqlstr = "TRANSACTION $tranname
> >>
> >> SELECT rows from CASES
> >> WHERE id = $id
> >> GO
> >>
> >> /* maybe find the date / time from a system table sp_something of the
last
> >> time the row was modified?? */
> >>
> >> START TRANSACTION $tranname
> >> GO
> >> ";
> >>
> >> But that probably won't work thinking about it (and looking at the
stupid
> >> senseless code I have written above!!!!) The transcation probably
> >> need to be
> >> around the update SQL doesn't it?  And then do a rollback if it finds
> >> another user has updated lately?  And then reload the data and
> >> send it back
> >> to the form for the user to check (then they can update - after
> >> checking the
> >> other users data?)
> >>
> >> Anybody have a solution /views on this?  Anybody had to fix a similar
> >> problem?  Or is all this paranoia (will the DB handle this problem on
it
> >> own? - I very much doubt that last comment!)
> >>
> >> Any help would be most appreciated, I don't need all of the PHP code
just
> >> the concepts will do (I have been using PHP/MS-SQL for a while) or some
> >> example T-SQL if you think thats the solution I should go for.
> >>
> >> Thanks very much in advance...
> >>
> >> Oliver Cronk
> >>
>



-- 
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]

Reply via email to