On Wed, 02 Apr 2003 11:10:04 -0600 gerald_clark <[EMAIL PROTECTED]> wrote:
> A Checks for empty > B Checks for empty > A Updates > A Reads ( and owns record ) > B Updates > B Reads ( and owns record ) > Reality says to do it more like this.... A Write lock on table B Tries to write lock, can't, wait A Checks for emtpy B Tries to write lock, can't, wait A Update B Tries to write lock, can't, wait A Reads (and owns record) B Tries to write lock, can't, wait A Release Write lock on table B Write lock on table B Checks for empty, not empty, record in use. A Tries to Update, can't because of write lock by B B Releases write lock A Updates Record (removing row lock) B Write lock on table B Checks for empty B Update B Reads (and owns) record B Release write lock on table B Updates record (removing row lock) Of course, B should be able to timeout (not block indefinately), and there should be some way to recover locked rows where process A crashes and can't update the row to make it available again. I'm not sure what mysql does if a connection is lost to a client that owns a table lock... If mysql doesn't auto clean up the table locks, then that will need to be coded as well. function lockrecord(id, table) { retval=FALSE; retries=0 while (!((locked = locktable(table))) || (retries == 5)) { sleep(10); retries++; } if (locked) { if (record_available(id)) { if (update_record_lock(id)) { retval = TRUE; } } unlocktable(table); } return(retval); } Or, you could build the retries and sleep into the locktable() function and only have it return true or false... -- Eric Calvert kyconnection.com, inc. -- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]