Ну, если можно хранить временные метки 1000 шар, то можно хранить и ид приславших их.
Без риска взаимных блокировок мы можем изменять только записи, которые имеют непосредственное отношение к юзеру, шара которого обрабатывается. Обновлять остальные записи мы можем только в случае редкого события, например конца раунда. В конце раунда мы можем с чистой совестью залочить всю таблицу и проапдейтить в один присест. В других же случаях, ситуация иная.
К примеру, мы можем изменять значение поля-счетчика в записи, соответствующей его учетке, как нам вздумается с каждой шарой. Допустим, есть у нас такой код:
update users set shares_total = shares_total + 1 where user_id = $1;
При запуске оператора update блокируются записи, попадающие под условие where, то есть только запись о пользователе с id, хранящемся в переменной $1. Таким образом, блокировки не оказывают существенного влияния на работу системы в целом и на процессы обновления счетчиков других пользователей, так как у них свои записи и свои блокировки. Но это так только если условие приводит к тому, что нет пересекающихся между юзерами записей. Т.е. не должно быть такого, чтобы два разных запроса пытались обновить одну и ту же запись одновременно, иначе сильно падает производительность. К примеру, если мы создадим табличку типа:
create table stats(
total_shares integer not null
);
и создадим в ней строку для хранения общего количества шар на пуле. Будем обновлять статистику по шарам внутри хранимой процедуры вот так:
update stats set total_shares = total_shares + 1;
то при 100-150 гигахэшах, размазанных по четырем серверам, результатом будут страшные тормоза сайта и множественные сообщения miner is idle от феникса, хотя, казалось бы, тормозить тут ну совершенно нечему. Именно потому что каждый новый процесс будет пытаться повесить блокировку одну и ту же единственную строку таблицы stats, будет становиться в очередь и выполнение функции будет приостанавливаться до снятия блокировки, либо принудительного убийства блокирующего процесса системой. Такого не произойдет, если pushpoold один, но если их 4 штуки, как у нас, и все используют одну БД-то произойдет обязательно.
Поэтому все не так просто, но есть пара методов это сделать, не вызвав подобную проблему (которые я использовал, когда переделывал систему недавно, самый простой метод-обновление/удаление только меток шар, которые соответствуют конкретному юзеру), и я этим займусь, если возникнет реальная необходимость. Но для начала надо увидеть результаты того, что есть сейчас.
Вообще, крайне рекомендую ознакомиться вот с этой табличкой:
http://zalil.ru/31522584К примеру, вот этими записями:
Flintenfu 2241 19 0,0496088
USSR 2182 2 0,04326501
Имхо, но система вполне демократично относится к юзерам. Разница в рейтинге почти в 10 раз, но награда отличается далеко не так сильно. Или вот, тоже хороший пример:
kaufmann 11328 69 0,32768917
overDen 11324 69 0,32757346
gaer 13093 31 0,31117626
Сравни разницу в рейтингах и разницу в наградах. Не так уж и страшно все, разве нет?