当同人在同一时刻同时修改数据库中同一笔记录的时候,会出现冲突,有三种方式处理:
1.保留最后一个修改的人的记录,即,不处理冲突。
2.使用悲观锁:
在更新数据之前,第一个用户将锁住他正在修改的记录,然后进行修改,其他用户保持等待直到锁释放。
3.使用乐观锁:
当用户提交修改的时候首先判断是否有人已经更新过了同一笔记录,如果没有人更改过,则直接提交,如果已经有人更改过,则修改将会失败,此时用户可以决定如何来处理这个冲突,比如覆盖之前的修改,或不执行自己的修改,或i刷新数据,然后执行自己的修改。
乐观锁有两种方式:
一、为表中某个数据列设置并发模式:Currency Mode:Fixed.
在edmx文件中,为UnitPrice列设置Concurrency Mode 为Fixed.
static void Main(string[] args)
{
NorthwindEntities NWEntities;
NWEntities = new TestLINQToEntitiesApp.NorthwindEntities();
Console.WriteLine("First User ...");
var product = (from p in NWEntities.Products where p.ProductID == 2 select p).First();
Console.WriteLine("Original price: {0}", product.UnitPrice);
product.UnitPrice += 1.0m;
Console.WriteLine("Current price to update: {0}", product.UnitPrice);
Console.WriteLine("\nSecond User ...");
using (NorthwindEntities1 NWEntities1 = new NorthwindEntities1())
{
Product1 product1 = (from p in NWEntities1.Product1 where p.ProductID == 2 select p).First();
Console.WriteLine("Original price: {0}", product1.UnitPrice);
product1.UnitPrice += 2.0m; Console.WriteLine("Current price to update: {0}", product1.UnitPrice);
NWEntities1.SaveChanges();
Console.WriteLine("Price update submitted to database");
}
// first user is ready to submit changes
Console.WriteLine("\nFirst User ...");
try
{
NWEntities.SaveChanges();
Console.WriteLine("Price update submitted to database");
}
catch (DbUpdateConcurrencyException e)
{
Console.WriteLine("Conflicts detected. Refreshing ...");
var entry = e.Entries.Single();
entry.OriginalValues.SetValues(entry.GetDatabaseValues());
NWEntities.SaveChanges();
Console.WriteLine("Price update submitted to database after refresh");
}
}
则NWEntities的修改将覆盖NWEntities1的修改。
二、增加一列version列:
然后在demx文件中为RowVersion列设置Concurrency Mode 为fixed.