C# 使用ADO.NET数据适配器的事务

C# 使用ADO.NET数据适配器的事务,c#,ado.net,transactions,dataadapter,C#,Ado.net,Transactions,Dataadapter,场景:我想让多个(可能是2到20个)服务器应用程序使用ADO.NET使用单个数据库。我希望单个应用程序能够获得数据库中记录集的所有权,将它们保存在数据集中的内存中(以提高速度),响应客户机对数据的请求,执行更新,并防止其他应用程序更新这些记录,直到所有权被放弃 我不熟悉ADO.NET,但使用带有数据适配器的事务(ADO.NET断开连接层)似乎可以做到这一点 问题第1部分:这样做对吗 问题第2部分:如果这是正确的方法,有人能给我介绍一下这种方法的教程或示例(C#)吗 问题第3部分:如果我想拥有单个

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

我不熟悉ADO.NET,但使用带有数据适配器的事务(ADO.NET断开连接层)似乎可以做到这一点

问题第1部分:这样做对吗

问题第2部分:如果这是正确的方法,有人能给我介绍一下这种方法的教程或示例(C#)吗

问题第3部分:如果我想拥有单个记录的所有权并独立发布它们,我是否需要为每个记录提供一个单独的事务,并通过扩展使用一个单独的DataAdapter和DataSet来保存每个记录,还是有更好的方法?每个应用程序可能同时拥有数千条记录的所有权。

  • 你打算把交易维持多久
  • 您将支持多少并发用户
这是你需要问自己的两个问题。如果前者的答案是“很长时间”,而后者的答案是“很多”,那么这种方法可能会遇到问题

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

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

我认为满足您所述要求的最佳方法是编写锁管理器/记录签出系统。马丁·福勒把这称为一场战争

更新

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

ALTER TABLE T1 SET(锁定升级=禁用)

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

  • 你打算把交易维持多久
  • 您将支持多少并发用户
这是你需要问自己的两个问题。如果前者的答案是“很长时间”,而后者的答案是“很多”,那么这种方法可能会遇到问题

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

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

我认为满足您所述要求的最佳方法是编写锁管理器/记录签出系统。马丁·福勒把这称为一场战争

更新

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

ALTER TABLE T1 SET(锁定升级=禁用)


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

您实际上需要并发控制和事务支持

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


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

您实际上需要并发控制和事务支持

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


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

是的,我正考虑让交易长时间开放。所有访问数据库的应用程序都是服务器端的。这些应用程序的数量将非常少,最多可服务数千个客户端。记录的所有权只会在服务器应用程序之间偶尔迁移。只有在多个服务器应用程序试图同时访问相同记录的错误情况下,才会出现这种情况。由于这些条件,我希望可以使用事务实现悲观并发。您关于SQL server贪婪锁定的警告听起来像是个大问题。@Ergwu