代码之家  ›  专栏  ›  技术社区  ›  Ergwun

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

  •  1
  • Ergwun  · 技术社区  · 16 年前

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

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

    问题1: 这样做对吗?

    问题2: 如果这是正确的方法,有人能告诉我这种方法的任何教程或例子吗(用C#)?

    问题3:

    2 回复  |  直到 16 年前
        1
  •  1
  •   Randy Levy    16 年前
    • 你打算把这笔交易维持多久?

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

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

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

    我认为满足您所说的需求的最好方法是编写锁管理器/记录签出系统。马丁·福勒称之为 Pessimistic Offline Lock

    更新

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

    ALTER TABLE T1 SET (LOCK_ESCALATION = DISABLE);

        2
  •  0
  •   this. __curious_geek    16 年前

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

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

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