Begumisa Gerald M <[EMAIL PROTECTED]> wrote on 02/22/2005 02:03:43 AM:
> Hi, > > I'm writing an application that uses InnoDB tables to provide > transactional integrity. The front-end is a web-based interface. > > I'd like to know - is there a way one can issue a query to test whether a > particular set of rows (or row) has already been locked by another session > - rather than the default action of waiting for quite long for the lock to > be granted. > > The idea is so that a person using the front-end may know whether the > information they are attempting to access is "unavailable" at the time. > There will be situations where rows will be locked exclusively for > prolonged times and I wouldn't want the web application users to be > subjected to these lengthy delays but rather be told to try later. > > > Regards, > Gerald. > Are you saying that you want to use a transactional or table lock in place of an application-level mutex object? I think you are trying to ask the DB to do more than it is intended to do (not that it couldn't do what you ask but it is unusual to hold a table lock or transaction open for any intentional length of time. Usually the database sets and releases locks like that in response to a series of statements on the order of sub-seconds, not for the several seconds to minutes that may be required of an application-level lock). I have a similar situation (another user may already be "editing" a particular record. only one user can edit a record at any one time) in one of my web-based applications. I created a new field to hold the ID of the application user that has the exclusive privileges on that record. That way the application deals with application-level logic (no more than one editor at a time) and I use db-level transactions to set and unset the "editor" field as appropriate. The record is locked for the shortest length of time and you can easily and quickly check the value of the field so that your users can know immediately if they have rights to edit the record or not. It takes a bit more logic written into your application but the performance gains and the speed of the user-feedback is well worth the effort. Opening a transaction on one page request and closing it on another (as when the results are submitted) will be VERY difficult for you to manage as transactions are connection-specific and unless you are using a pooled or global connection variable, you will be creating and destroying connections rather frequently. It's generally not a good idea to put a DB-level lock (TABLE lock or open transaction) on a record to enforce an application-level rule, especially in the mostly-stateless, asynchronous world of web-based development. Shawn Green Database Administrator Unimin Corporation - Spruce Pine