【问题标题】:delphi xe7 firedac locking on mssql server德尔福 xe7 fireac 锁定在 mssql 服务器上
【发布时间】:2016-02-19 21:28:15
【问题描述】:

我在使用 FireDAC 并锁定 mssql-server 时遇到了一些奇怪的问题,但不知道这是怎么发生的。所以我希望有人有一些经验并能帮助我:)

我们有以下情况: 在我们的应用程序中,我们有一个表格 ToDo 和一个表格 ToDoNotes。两者都有主唯一键 ID,它们通过 ToDoNotes.ToDoID 链接。 ToDo 表用于记录下一个任务,而 ToDoNotes 表用于在每个任务上留下 cmets。因此,表 ToDoNotes 中的多条记录可以对应表 ToDo 中的一条记录。我们使用 FireDac Table-Component FDTable 连接到这些 mssql 表。连接有lockmode pessimisticlocktpoint immediate

以下步骤正在锁定完整的表格ToDoNotes,我不知道为什么:

第一节:

  1. TblToDo.Edit 记录 1
  2. TblToDoNotes.Append 为 TblToDo-record 1 追加一条记录

所以两个表现在都处于 EditMode 中。

第二场:

  1. TblToDoNotes.Append

此时应用程序(会话二)被冻结,直到我们在会话一中执行TblToDo.PostTblToDo.Cancel。 在 Microsoft Managment Studio 中,我可以看到带有 waittype LCK_M_S 和资源 ridlock

的会话二

有人知道出了什么问题吗?如果我们在两个不同的会话中将记录附加到 TblToDoNotes,一切正常。在我看来,如果已经有一个表处于编辑模式或类似的状态,FireDAC 会创建第二个事务来阻止整个表 ToDoNotes

非常感谢每一个帮助。

马库斯

【问题讨论】:

    标签: sql-server delphi locking firedac


    【解决方案1】:

    我认为您的问题是您创建了主记录并同时创建了详细记录。此时主记录没有有效ID,你发布后,它就会得到一个有效ID,你可以在明细记录中使用它。 根据我的经验,安全的方法是首先创建主记录,发布它,然后添加详细记录

    【讨论】:

    • 感谢您的回复,但我想有一个误解。我已经在 TblToDo 中有 2 条记录,只需通过调用 TblToDo.Edit 在 EditMode 中设置记录 1。然后我开始通过 TblToDoNotes.Append 添加记录。此时一切都还可以。仅当有人通过调用 TblToDoNotes 开始在 TblToDoNotes 中添加另一条记录时。追加他的会话冻结。
    • 是的,可能是误会。我不明白您为什么需要在编辑模式下在 TblToDo 中设置记录,以便添加 Notes 记录(您是这个意思吗?)。您能否展示一下您对这两张桌子的设计以及如何加入它们。我的直觉告诉我,问题可能是有原因的
    • EditMode 中无需在 TblToDo 中设置记录即可在 TblToDoNotes 中追加记录。但这实际上是用户所做的,我想了解它如何在我描述的问题中运行。如果用户已经在 EditMode 中获得了 TblToDo 的记录,则很容易阻止“TblToDoNotes.Append”功能,但首先我想了解为什么这会造成如此大的问题。 TblToDo 有字段 Name (nchar, 40) 和 description (nvarchar(max)),TblToDo 有字段 Memo (nvarchar(max)) 和 ToDoID (Integer)。 “ToDoID”通过引用完整性规则链接两个表。
    【解决方案2】:

    您是否成功解决了这个问题?我有一个类似的问题,它似乎是 fetchoptions 模式参数。当设置为 onDemand 时,它使进程保持打开并等待。我通过将其设置为 fetchall 解决了我的问题,但是,缺点是查询需要更长的时间才能打开。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多