Как раздавать уникальные записи таблицы во многопоточном парсере?
Никакие транзакции тут не нужны. транзакции вообще не про это. Почему-то новички упорно путают транзакции с блокировками.  Транзакция - это про целостность данных. А чтобы два процесса не считали одну строку - это блокировка. 
Но явные блокировки тут тоже не нужны. 

Сначала забираем запись на себя
update urls set proxy=proxy_id where done=null and proxy=null limit 1
потом уже её селектим, работаем, и в конце отпускаем
select * from urls where proxy=proxy_id
...
Update urls set proxy=null, done=1 where proxy=proxy_id
Select потом Update - работать не будет. Потому что никто не помешает другому потоку выбрать ровно тоже запись пока делается update первым потоком. Для избежания такого есть блокировки.