【发布时间】: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 pessimistic 和locktpoint immediate。
以下步骤正在锁定完整的表格ToDoNotes,我不知道为什么:
第一节:
- TblToDo.Edit 记录 1
- TblToDoNotes.Append 为 TblToDo-record 1 追加一条记录
所以两个表现在都处于 EditMode 中。
第二场:
- TblToDoNotes.Append
此时应用程序(会话二)被冻结,直到我们在会话一中执行TblToDo.Post 或TblToDo.Cancel。
在 Microsoft Managment Studio 中,我可以看到带有 waittype LCK_M_S 和资源 ridlock
有人知道出了什么问题吗?如果我们在两个不同的会话中将记录附加到 TblToDoNotes,一切正常。在我看来,如果已经有一个表处于编辑模式或类似的状态,FireDAC 会创建第二个事务来阻止整个表 ToDoNotes。
非常感谢每一个帮助。
马库斯
【问题讨论】:
标签: sql-server delphi locking firedac