1

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

我是 ADO.NET 的新手,但似乎这应该可以使用带有数据适配器的事务(ADO.NET 断开层)。

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

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

问题第 3 部分:如果我希望能够获得单个记录的所有权并独立发布它们,我是否需要为每条记录单独的事务,并通过扩展单独的 DataAdapter 和 DataSet 来保存每条记录,或者是否有更好的方法来做到这一点?每个应用程序可能同时拥有数千条记录的所有权。

4

2 回答 2

1
  • 您打算将交易保持多长时间?
  • 你要支持多少并发用户?

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

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

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

我认为满足您所说的要求的最佳方法是编写锁定管理器/记录结帐系统。Martin Fowler 称之为悲观离线锁

更新

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

ALTER TABLE T1 SET (LOCK_ESCALATION = DISABLE);

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

于 2010-06-18T06:17:59.497 回答
0

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

Transaction只有在对数据库执行多项操作时才会出现。一旦连接被释放,事务就不再适用。

concurrency让您可以对同一数据进行多次更新。如果两个或多个客户端持有相同的数据集,并且一个需要在另一个客户端更新数据后读取/写入数据,则并发性将让您决定保留哪一组更新以及忽略哪一组更新。提及并发的概念超出了本文的范围。查看这篇文章了解更多信息。

于 2010-06-18T06:24:51.007 回答