Hi Shawn,
Thanks for taking time to respond to this.
> [...]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).
Actually this is a bit different: On one side of the database is a
telephony application which requires that certain information in the table
does not change for the period of time that a call is active - and the
only way such information would change is if it were modified from the web
interface. Because within the [multithreaded] telephony system there are
application level locks that enforce concurrency in this respect - testing
a mutex lock here would tell whether an account is available or
unavailable quite easily - without having to attempt to lock a particular
set of rows in the DB.
The issue comes in ensuring that the web application does not modify that
information in the table while a call is in progress. To me it looked
like a DB level solution of some sort would be the best.
> 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.
That's an interesting way to do it, actually - it'll be abit of work but I
think its not bad at all. I was just curious about whether you could
"test" for a lock in InnoDB - it'd save alot of trouble.
> 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,
Actually, as I explained its abit different - its not between page
requests that I want to open / close transactions but rather to make sure
the web application users do not modify table information while a call is
in progress (i.e while the telephony application is "holding" the lock to
a given user's information).
> you will be creating and destroying connections rather frequently.
Actually not, the web application architecture is abit as below:
[webserver]-{ENV}-[Small CGI Program]-{TCP/IP}-[Daemon]===[MySQL]
^^^
I.e there's a pool of persistent connections to the MySQL database that
are maintained and reused / shared.
> 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.
I see. What are some of the reasons why this would be so?
Thanks!
Rgds,
Gerald.
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]