What is the purpose of the ConcurrencyStamp
column in the AspNetUsers
table in the new ASP.NET MVC 6 identity?
This is the database schema of the AspNetUsers
table:
It is also there in the AspNetRoles
table:
As I remember it wasn't there in the ASP.NET MVC 5 identity.
What I've noticed so far is that it seems to have GUID values as it is defined with the following code:
/// <summary>
/// A random value that must change whenever a user is persisted to the store
/// </summary>
public virtual string ConcurrencyStamp { get; set; } = Guid.NewGuid().ToString();
But this documentation is not sufficient for me to understand in which situations it is used.
As the name state, it's used to prevent concurrency update conflict.
For example, there's a UserA
named Peter in the database
2 admins open the editor page of UserA
, want to update this user.
Admin_1
opened the page, and saw user called Peter.Admin_2
opened the page, and saw user called Peter (obviously).Admin_1
updated user name to Tom, and save data. Now UserA
in the db named Tom.Admin_2
updated user name to Thomas, and try to save it.What would happen if there's no ConcurrencyStamp is Admin_1's update will be overwritten by Admin_2's update.
But since we have ConcurrencyStamp
, when Admin_1
/Admin_2
loads the page, the stamp is loaded. When updating data this stamp will be changed too.
So now step 5 would be system throw exception telling Admin_2 that this user has already been updated, since he ConcurrencyStamp
is different from the one he loaded.