首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与ADO.NET数据适配器一起使用事务

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

Stack Overflow用户
提问于 2010-06-17 08:25:06
回答 2查看 1.5K关注 0票数 1

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

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

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

问题第2部分:--如果这是正确的方法--有人能告诉我这种方法的任何教程或示例(在C#中)吗?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-18 06:17:59

  • 你想让这笔交易开放多久?
  • 您将支持多少并发用户?

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

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

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

我认为,如您所述,满足这些要求的最佳方法是编写一个锁管理器/记录结帐系统。Martin称之为悲观离线锁

更新

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

ALTER TABLE T1 SET (LOCK_ESCALATION = DISABLE);

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

票数 1
EN

Stack Overflow用户

发布于 2010-06-18 06:24:51

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

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

concurrency允许您处理同一数据上的多个更新。如果两个或多个客户端持有相同的数据集,而其中一个客户端需要在另一个客户端更新数据后读取/写入数据,则并发性将允许您决定保留哪一组更新以及忽略哪些更新。提到并发的概念超出了本文的范围。查看文章以获得更多信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3060017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档