繁体   English   中英

将事务与ADO.NET数据适配器一起使用

[英]Using transactions with ADO.NET Data Adapters

方案:我想让多个(大概2到20个)服务器应用程序通过ADO.NET使用单个数据库。 我希望各个应用程序能够拥有数据库中记录集的所有权,将它们保留在数据集中的内存中(以提高速度),响应数据上的客户端请求,执行更新,并防止其他应用程序更新这些记录直到所有权已被放弃。

我是ADO.NET的新手,但似乎可以使用带有数据适配器(ADO.NET断开连接层)的事务来实现。

问题部分1:尝试这样做的正确方法吗?

问题第二部分:如果这是正确的方法,谁能指出我这种方法的任何教程或示例(在C#中)?

问题部分3:如果我希望能够获得单个记录的所有权并独立释放它们,那么我是否需要为每个记录进行单独的交易,并通过扩展单独的DataAdapter和DataSet来保存每个记录,或者是否需要更好的方法呢? 每个应用程序可能同时拥有数千个记录的所有权。

  • 您考虑保持交易多久了?
  • 您要支持多少个并发用户?

这是您需要问自己的两个问题。 如果前者的答案是“很长一段时间”,而后者的答案是“很多”,那么这种方法可能会遇到问题。

因此,我对第一个问题的回答是:不,这可能不是正确的方法。

如果您采用事务锁定方法,那么将限制可伸缩性和响应时间。 您也可能会遇到数据库错误。 例如,SQL Server(假设您正在使用SQL Server)可能非常贪婪地使用了锁定,并且可能锁定了比您请求/期望的资源更多的资源。 应用程序可以请求一些行级别的锁来锁定它“拥有”的记录,但是SQL Server可以将这些行锁升级为表锁。 这将阻止并可能导致超时或死锁。

我认为满足要求的最佳方法是编写锁管理器/记录签出系统。 马丁·福勒(Martin Fowler)将此称为悲观的离线锁

更新

如果您使用的是SQL Server 2008,则可以在表级别上设置锁升级行为:

ALTER TABLE T1 SET (LOCK_ESCALATION = DISABLE);

这将在“大多数”情况下禁用锁升级,并可能对您有所帮助。

实际上,您需要并发控制以及事务支持。

仅当您对数据库执行多个操作时, Transaction才会出现。 释放连接后,该交易将不再适用。

concurrency使您可以对同一数据进行多个更新。 如果两个或多个客户端拥有相同的数据集,而一个需要在另一客户端更新数据后读取/写入数据,则并发将让您决定保留哪一组更新,而忽略哪一组更新。 提到并发的概念超出了本文的范围。 结帐文章以获取更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM