<p>I have a web application (asp.net) where work items are submitted and allocated to users according to their workload.</p>

<p>A user's workload is calculated using an algorithm based on the number of items currently allocated to the user (and some other factors). Each new item is allocated to the user with the lowest current workload, increasing their workload. A user's workload decreases when they finish an item. Items will be submitted, allocated and finished concurrently - hence workload levels will be continually changing. Work items are stored in a SQL database.</p>

<p>I need a way to ensure that every allocation decision is made using an up-to-date picture of workload across the user base.</p>

<p>My idea is to provide a read/write synchronized store of workload information in the Cache. </p>

<p>Is this the best approach? Or should I use the database to control locking? How do I avoid bottle-necks in my application?</p>

<p>Advice much appreciated.</p>

I would use a database to control this, as it's highly unlikely users will be completing work quickly enough to need a more real-time approach.
So I would have a series of tables, relating to work items, which you can query to calculate current work levels, and thus determine the next person to receive a particular work item.
You could then have a series of stored procedures to mark work items as complete, or to allocate a work item to someone.
To minimize bottle-necks ensure your database is normalised well, and your stored procedures do not use many tables, and this should ramp up nicely.
To check this, you could write some test harnesses to ensure the allocation of work items, and performance is what you desire under high usage.