2010-06-17 26 views
1

场景:我想让多个(可能是2到20个)服务器应用程序使用ADO.NET使用单个数据库。我希望单个应用程序能够获取数据库中记录集的所有权,将它们保存在DataSets中的内存中(为了提高速度),响应客户机对数据的请求,执行更新并防止其他应用程序更新这些记录直到拥有权已被放弃。使用与ADO.NET数据适配器交易

我是新来的ADO.NET,但它似乎应该有可能使用数据适配器(ADO.NET断开连接层)事务。

问题第1部分:这是正确的方法来尝试做到这一点吗?

问题第2部分:如果这是正确的方式,任何人都可以点我在这种方法的任何教程或实例(在C#)?

问题第3部分:如果我想能够采取的个人记录的所有权,并独立地释放出来,我是将需要为每个记录单独的事务,并通过扩展一个单独的DataAdapter和DataSet来保持每个记录,还是有更好的方法来做到这一点?每个应用程序可能会同时拥有数千条记录。

回答

1
  • 您想保持交易持续多久?
  • 你打算支持多少个并发用户?

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

所以,我对问题一的回答是:不,这可能不是正确的方法。

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

我认为满足要求的最好方法就是编写锁管理器/记录结帐系统。 Martin Fowler称之为Pessimistic Offline Lock

UPDATE

如果您使用的是SQL Server 2008中,你可以设置一个表级锁升级行为:

ALTER TABLE T1 SET (LOCK_ESCALATION = DISABLE);

这将禁用“最”的情况下锁升级和可以帮助你。

+0

是的我在考虑让交易长时间保持开放状态。所有访问数据库的应用程序都是服务器端。只有少数这些应用程序可供多达数千个客户端使用。记录的所有权只会在服务器应用程序之间很少迁移。只有在多个服务器应用程序试图同时访问相同记录的错误情况下。由于这些条件,我希望我可以使用事务来实现悲观并发。但是,关于SQL服务器的贪婪锁定的警告听起来像是一个主要问题。 – Ergwun 2010-06-21 02:43:54

+0

@Ergwun:你在使用SQL Server 2008吗? – 2010-06-21 03:18:41

+0

是的,目前,但我希望让我的应用程序独立于数据提供者。谢谢。 – Ergwun 2010-06-21 04:02:43

0

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

Transaction只有当您对数据库执行多个操作时才会出现图片。一旦连接被释放,交易不再适用。

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

+0

我曾希望使用长事务来实现悲观并发。由于应用程序都是服务器应用程序,我希望这是一个可行的解决方案。 – Ergwun 2010-06-21 02:44:38

+0

看看这种情况下的TransactionScope。 – 2010-06-21 05:29:08