Greetings,<br>
<br>
I'm having a hard time understanding how to ensure that I avoid stale data.<br>
<br>
Here is a scenario that will hopefully get right to the point.<br>
<br>
User:<br>
&nbsp;id<br>
&nbsp;userName<br>
&nbsp;email<br>
&nbsp;lastAction<br>
<br>
A user with id 1 makes two simultaneous requests which we'll call
request A and request B: A posts a message to some forum and B changes
the user's email address. Lets assume that a valid User object exists
under the key &quot;user_1&quot;. Here is a chronological list of events as they
occur in request A and B<br>
<br>
1. A: user = memcached.get(&quot;user_1&quot;)<br>
2. B: user = memcached.get(&quot;user_1&quot;)<br>
3. B: user.email = &quot;newemail&quot;, user.lastAction = now<br>
4. B: SQL update on user id=1<br>
5. B: memcached.set(&quot;user_1&quot;, user)<br>
6. A: user.lastAction = now<br>
7. A: SQL update on user id=1<br>
8. A: memcached.set(&quot;user_1&quot;, user) *** Here lies the problem<br>
<br>
Now the memcached version of user_1 has stale data for the email address.<br>
<br>
Is there a built-in or standard way of addressing this?<br>
<br>
Does this sound valid:<br>
<br>
1. When an object comes from memcached, keep an original copy of the object.<br>
2. When setting an object to memcached, perform another get and ensure
that the original copy is the same as the one that came out.<br>
3. If so, then do the set. If not, then expire the entry.<br>
<br>
This still leaves a small hole open for however long it takes to
perform the get, comparison, and subsequent set , but it seems much
less likely for stale data to get through.<br>
<br>
<br>
The final solution is to just expire the data whenever its updated, but that seems awfully wasteful.<br>
<br>
What are you thoughts on this?<br>
<br>
-Michael Carter