• [织梦吧]唯一域名:www.dedecms8.com,织梦DedeCMS学习平台.

当前位置: > 编程与数据库 > net编程 >

LINQ那些事儿(3)- 事务和并发冲突处理(2)

来源: www.dedecms8.com 编辑:织梦吧 时间:2012-06-27点击:

11 -- @p4: Input NVarChar (Size = 13; Prec = 0; Scale = 0) [Obere Str. 57]
12 -- @p5: Input NVarChar (Size = 6; Prec = 0; Scale = 0) [Berlin]
13 -- @p6: Input NVarChar (Size = 5; Prec = 0; Scale = 0) [12209]
14 -- @p7: Input NVarChar (Size = 7; Prec = 0; Scale = 0) [Germany]
15 -- @p8: Input NVarChar (Size = 11; Prec = 0; Scale = 0) [030-0074321]
16 -- @p9: Input NVarChar (Size = 11; Prec = 0; Scale = 0) [030-0076545]
17 -- @p10: Input NVarChar (Size = 17; Prec = 0; Scale = 0) [Updating customer]

 

为什么LINQ2SQL在生成Where语句时,不但包含了CustomerID(Primary key),还包含了其他所有的属性列呢?就是为了检测冲突,注意看传递的参数——Customer object的原始值,通过原始值和数据库值比较,判断自上次查询后数据库值是否发生了更改。当发生更改时,上面的sql语句执行返回 @@ROW_COUNT=0,LINQ2SQL以此判断是否发生了开放式并发。

上面的代码是示例LINQ2SQL根据ColumnAttribute.UpdateCheck的设置来生成的Where子句的情况。除此之外,LINQ2SQL还可以根据标记为IsVersion和IsPrimary属性来生成Where子句,这样可以生成更短的SQL语句。

参考资料:

如何指定测试哪些成员是否发生并发冲突

http://msdn.microsoft.com/zh-cn/library/bb399394.aspx

如何将列表示为时间戳或版本列

http://msdn.microsoft.com/zh-cn/library/bb386957.aspx

我们来看下面的代码,你认为在执行SubmitChanges时会产生冲突吗?

01 var context = GenerateContext();
02 var customerA = context.Customers.First();
03 var customerB = context.Customers
04 .Where(b => b.CustomerID == customerA.CustomerID).Single();
05
06 customerA.CompanyName = "Updating customerA";
07 customerB.CompanyName = "Updating customerB";
08 context.SubmitChanges();
09
10 Customer customerC = context.Customers
11 .Where(c => c.CustomerID == customerA.CustomerID).Single();
12 Console.WriteLine(customerC.CompanyName);

不会! CompanyName被更新为”Updating customerB”。这是因为在DataContext对象中缓存了查询返回的entity object的引用,在下一次查询时,如果发现缓存中已经存在Primary Key与数据库查询返回数据的Primary Key相同的对象时,不再重新映射,而是直接返回已经缓存的对象,所以customerA和customerB是指向同一个对象的,这样就保证了属于同一个DataContext对象的entity object,在SubmitChanges时不会产生开放式冲突。

1 Console.WriteLine(customerA == customerB);  // 输出为True

About D8

  • ©2014 织梦吧(d8) DedeCMS学习交流平台
  • 唯一网址 www.DedeCMS8.com 网站地图
  • 联系我们 1978130638@qq.com ,  QQ