There is another solution that requires no changes to the database structure, but it requires a bit more memory and some additional "fiddling" when you do an update or delete.
You can implement "extremely optimistic" locking by making sure that the DAL keeps two buffers with all of the PK (Primary Key) values and any other columns that are "interesting" to it. One buffer is "private" and used only by the DAL, there other buffer is "public" (or at least it can be exposed outside the DAL).
When an update needs to be done, the DAL can check to ensure that there are some differences between the public and private buffers (to be sure an updated is actually needed), then read a check buffer worth of data to see if the attributes have been changed between the private copy and the check buffer. No change in values between the private and the check buffer means that the update is safe. A change means the update will over write another change, which is usually bad (but sometimes you want to force it anyway).
Anyhow, I think I've had enough sleep to make this description lucid, but feel free to abuse me if the idea interests you but I haven't made it clear enough.
-PatP