在Linq to Sql中管理并发更新时的冲突(3)
2008-04-02 11:01:01来源:互联网 阅读 ()
在Linq to Sql中管理并发更新时的冲突(3):使用记录的时间戳进行检测
在《在Linq to Sql中管理并发更新时的冲突(2):引发更新冲突》一文中,我们描述了Linq to Sql检测在更新时是否产生了冲突的基本方法:将该记录每个字段原来的值和更新时的值进行对比,假如稍有不同则意味着记录被修改过,因此产生了更新冲突。但是您是否有这样的感觉,这种方法实在累赘了一些?假如一个表中有数十个字段,那么更新就必须完整地检测一遍(但是我会在今后的文章中提到这方面的控制)。再者,假如其中某一个字段储存了洋洋洒洒上万字的文章,那么在验证时仅仅是将他从Web服务器发送到数据库服务器就需要耗费可观的带宽和时间,这是不是显得有些“得不偿失”呢?
因此Linq to Sql提供了另外一种检测并发更新冲突的方式:使用记录的时间戳。这并不是Linq to Sql特有的功能,假如您了解其他的ORM框架的话,就会发现诸如Hibernate也提供了类似的机制——自然,在使用上不会像Linq to Sql那样方便。
在Sql Server中设计数据表时,我们能够使用一个特别的数据类型:timestamp。请不要将他和SQL-2003标准中的timestamp类型混淆起来,那里的timestamp和Sql Server中的datetime比较相似(Oracle中timestamp的概念符合SQL-2003标准,而MySql中timestamp的概念和Sql Server相同),而Sql Server中的timestamp和SQL-2003标准中的rowversion类型对应。Sql Server中的timestamp类型和binary(8)在存储上很类似(但是nullable的timestamp和nvarchar(8)类似),从类型名称上我们就能够看出,这是个“时间戳”字段:当数据表中的某一条记录被添加或修改之后,Sql Server会自动向类型为timestamp的字段写入当前时间。换句话说,只要在更新时发现该字段的值没有被修改过,就表明没有产生并发冲突。
我们还是通过一个例子来体验一下吧。
如上图。我们定义了一个新的数据表,其中有个record_version字段为timestamp类型,这就是记录的时间戳(record_version这个字段名似乎有点不太“雅观”,我觉得我们不会去主动使用他,所以问题不大——当然一些静态检查工具可不这么认为:))。有了记录的时间戳,我们就能够在检测更新冲突时获得更好的性能了。
try { LinqToSqlDemoDataContext dataContext = new LinqToSqlDemoDataContext(); Order order = dataContext.Orders.Single(o => o.OrderID == 1); order.Name = "New Order Name"; dataContext.Log = Console.Out; // 在下面的语句上配置一个断点 dataContext.SubmitChanges(); } catch (ChangeConflictException e) { Console.WriteLine(e.Message); } Console.ReadLine(); |
在最后的语句上配置断点,并且在程式运行至断点后去数据库里对OrderID为1的纪录作任意更新。然后按F5继续运行:
UPDATE [dbo].[Order] SET [Name] = @p2 WHERE ([OrderID] = @p0) AND ([record_version] = @p1) SELECT [t1].[record_version] FROM [dbo].[Order] AS [t1] WHERE ((@@ROWCOUNT) > 0) AND ([t1].[OrderID] = @p3) -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [1] -- @p1: Input Timestamp (Size = 8; Prec = 0; Scale = 0) [SqlBinary(8)] -- @p2: Input NVarChar (Size = 14; Prec = 0; Scale = 0) [New Order Name] -- @p3: Input Int (Size = 0; Prec = 0; Scale = 0) [1] -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8 Row not found or changed. |
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 在Linq to Sql中管理并发更新时的冲突(1):预备知识 2008-04-02
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash