I couldn't agree more with Wendy. But, as with more things, it comes down to your application.

I work at a large financial institution, so I deal with these types of situations quite a bit. It all depends on what is being edited.

If we are talking about something like, say, a fund load fee reference table, it might be appropriate to use an pessimistic locking mechanism where once one user obtains a lock on a record, no one else can edit it until their changes have been committed (whether you allow reads or not is still a question). What I've done in these instances is (a) tied the unlocking code to a SessionListener so that if the user walks away, I unlock any record they had locked when their session expires (typically no more than 20 minutes). Their changes are lost of course, and (b) clear all record locks at app startup, in case it goes down and is restarted (which is more interesting than you might think since we're hosted in a clustered environment, but that's a whole other ball of wax!)

If it's more of a transactional system, or a system where a record can't be locked for any real length of time, i.e., maybe a customer record that can't truly be locked for more than a few seconds, there are plenty of games to be played, but they all generally come down to some sort of timestamp and logic to work with it. I also generally have some sort of background/periodic process to check for stale locks and get rid of them. The details of this are usually app-specific and so there probably isn't any general-purpose answer to give.

As Wendy said though, locking is usually best handled in the database itself. The one big exception is something like a wizard interface where the lock has to persist across multiple requests for a given session. If you don't have such a requirement though, if a record is a per-request thing, I for one would definitely council against doing anything but locking in the RDBMS itself, and I would generally use a pessimistic locking scheme, with the understanding that this directly impacts scalability. Again, it comes down to what the app is and has to do though, that might be acceptable, or it might not be.

Frank

Wendy Smoak wrote:
On 11/1/05, Murray Collingwood <[EMAIL PROTECTED]> wrote:


The scenario is very simple:

1. User A clicks an "edit" option to edit a record.
2. While user A is editing the record user B clicks the same "edit" option
3. Both users are now editing the same record (or so they think)
4. User A clicks "save" and the record is updated and displays the changes
made by
user A - user A is happy
5. User B clicks "save" and these changes overwirte the changes made by
user A,
however user B doesn't know this and the changes made by user B appear.



Trying to hold real database-level record locks from a web interface is just
asking for trouble. The user wanders away, the connection drops...
meanwhile, no one else can get to that record.

I'm in a situation where I have to work around a telnet app that thinks it
is the only thing accessing the database. I calculate a checksum when I read
a record, and then check again before writing the record back. If the
checksum has changed, then someone else touched the record (most likely from
the telnet interface) and the web-user loses.

This happens in the data access layer, Struts doesn't know anything about it
other than being configured to handle a RecordModifiedException.

--
Wendy


--
Frank W. Zammetti
Founder and Chief Software Architect
Omnytex Technologies
http://www.omnytex.com
AIM: fzammetti
Yahoo: fzammetti
MSN: [EMAIL PROTECTED]

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to