Skip to content
Advertisement

How to select and update row, so that the same row could not be selected again by any user?

I am sending sms to mobile numbers using many apis at the same time, now I want to ensure that only one sms should be sent to one mobile number.

I am selecting a row using the following query

SELECT s_contact_name, s_contact_number, i_sms_sent_count 
FROM contacts 
WHERE i_sms_sent_count = 0 
ORDER BY ts_time_collected DESC 
LIMIT 1;

while selecting the row I want to set field i_sms_sent_count to 1 so that this row could not be selected again by any user.

Advertisement

Answer

One method is to do the update and then get the values. Assuming you have a contact_id column:

update contacts 
    set i_sms_sent_count = 1,
        contact_id = (@contact_id := contact_id)  -- does nothing except set the variable
    where i_sms_sent_count = 0 
    order by ts_time_collected desc 
    limit 1;

Then get the information:

select *
from contacts c
where contact_id = @contact_id;

EDIT:

An alternative is:

start transaction;

select contact_id into @contact_id
from contacts 
where i_sms_sent_count = 0 
order by ts_time_collected desc 
limit 1
for update;

update contacts
    set i_sms_sent_count = 0
    where contact_id = @contact_id;

commit transaction;
User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement