场景:--我想让多个(可能是2到20 )服务器应用程序使用一个使用ADO.NET的数据库。我希望单个应用程序能够获得数据库中的一组记录的所有权,将它们保存在DataSets中的内存中(为了速度),对数据上的客户端请求作出响应,执行更新,并防止其他应用程序在所有权放弃之前更新这些记录。
我是ADO.NET的新手,但似乎应该可以使用带有数据适配器的事务(ADO.NET断开连接层)。
问题第1部分:是尝试这样做的正确方法吗?
问题第2部分:--如果这是正确的方法--有人能告诉我这种方法的任何教程或示例(在C#中)吗?
问题第3部分:,如果我希望能够拥有单个记录并独立地释放它们,那么我是否需要对每个记录进行单独的事务处理,并且通过扩展使用一个单独的DataAdapter和DataSet来保存每个记录,或者有更好的方法来做到这一点?每个应用程序可能同时拥有数千条记录的所有权。
发布于 2010-06-18 06:17:59
这是你需要问自己的两个问题。如果前者的答案是“长时间”,而后者的答案是“很多”,那么这种方法很可能会遇到问题。
所以,我对第一个问题的回答是:不,这可能不是正确的方法。
如果您采用事务性锁方法,那么将限制您的可伸缩性和响应时间。您还可能遇到数据库错误。例如,Server (假设您正在使用Server)可能非常贪婪地使用锁,并且可能会锁定比请求/预期更多的资源。应用程序可以请求一些行级锁来锁定它“拥有”的记录,但是SQL Server可以将这些行锁升级为表锁。这将导致阻塞,并可能导致超时或可能导致死锁。
我认为,如您所述,满足这些要求的最佳方法是编写一个锁管理器/记录结帐系统。Martin称之为悲观离线锁。
更新
如果使用的是Server 2008,则可以在表级别上设置锁升级行为:
ALTER TABLE T1 SET (LOCK_ESCALATION = DISABLE);
这将在“大多数”情况下禁用锁升级,并可能对您有所帮助。
发布于 2010-06-18 06:24:51
您实际上需要并发控制以及事务支持。
只有当您在数据库上执行多个操作时,Transaction才会出现。一旦连接被释放,事务就不再适用。
concurrency允许您处理同一数据上的多个更新。如果两个或多个客户端持有相同的数据集,而其中一个客户端需要在另一个客户端更新数据后读取/写入数据,则并发性将允许您决定保留哪一组更新以及忽略哪些更新。提到并发的概念超出了本文的范围。查看这文章以获得更多信息。
https://stackoverflow.com/questions/3060017
复制相似问题