Andy Jackman said:
> Hi,
> I want to get any one of a number of rows that matches some criteria and
> update it so that it is marked as 'mine'. How can I do this safely?
>
> Given something like this table:
>
> create table tbl_new (
> t_value varchar(16) primary key not null,
> dt_used datetime,
> l_pid int(9)
> );
>
> I want to get any t_value WHERE dt_used is null and then set dt_used to
> prevent anyone else getting the same t_value.
>
> If I use locking (but I'm using C and I don't see any locking functions)
> (nor a START TRANSACTION?) I could:
>
> lock the tables,
> select t_value from tbl_new where dt_used is null;
> update tbl_new set dt_used = now() where t_value = 'whatever';
> unlock the tables;
>
> Without locking I could do something like this: (assume my-pid is unique
> between all users of this application at any one moment)
> while (1)
> {
> select t_value from tbl_new where dt_used is null;
> update tbl_new set dt_used = now(), l_pid = <my-pid> where t_value =
> '<whatever>' and l_pid is null;
> select l_pid from tbl_new where t_value = '<whatever>';
> if (l_pid == <my-pid>)
> break;
> // Else someone grabbed that record before us, go round and do it again
> }
>
> This sounds long winded to me. Anyone got a better suggestion?
> Thanks,
> Andy.
You almost have it. Look up 'Lock Tables' in the manual.
Unlike most database engines, mysql allows various types of tables. The
defaults is myisam which does not support transactions; however, InnoDB
does. Please see docs for details.
William R. Mussatto, Senior Systems Engineer
Ph. 909-920-9154 ext. 27
FAX. 909-608-7061
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]