Sql server mssql服务器上的delphi xe7 firedac锁定
我在FireDAC和mssql服务器上的锁定方面遇到了一些奇怪的问题,不知道这是怎么发生的。所以我希望任何有经验的人都能帮助我:) 我们的情况如下: 在我们的应用程序中,有一个表ToDo和一个表ToDoNotes。两者都有主唯一键ID,它们通过ToDoNotes.ToDoID链接。 表ToDo用于写下下下一个任务,表ToDoNotes用于对每个任务留下注释。因此,表ToDo中的多条记录可以用于表ToDo中的一条记录。我们使用FireDac表组件FDTable连接到这些mssql表。连接具有Sql server mssql服务器上的delphi xe7 firedac锁定,sql-server,delphi,locking,firedac,Sql Server,Delphi,Locking,Firedac,我在FireDAC和mssql服务器上的锁定方面遇到了一些奇怪的问题,不知道这是怎么发生的。所以我希望任何有经验的人都能帮助我:) 我们的情况如下: 在我们的应用程序中,有一个表ToDo和一个表ToDoNotes。两者都有主唯一键ID,它们通过ToDoNotes.ToDoID链接。 表ToDo用于写下下下一个任务,表ToDoNotes用于对每个任务留下注释。因此,表ToDo中的多条记录可以用于表ToDo中的一条记录。我们使用FireDac表组件FDTable连接到这些mssql表。连接具有锁模式
锁模式悲观
和锁点立即
以下步骤将整个表锁定为DONOTES,我不知道原因:
第一节课:
TblToDo.Post
或TblToDo.Cancel
。
在MicrosoftManagementStudio中,我可以看到waittypeLCK\u M\u S和resourceridlock
有人知道出了什么问题吗?如果我们在两个不同的会话中将记录附加到TblToDoNotes,那么一切都会正常工作。在我看来,FireDAC创建了第二个事务,如果已经有一个表处于editmode或类似的模式,该事务将阻止整个表的待办事项
非常感谢您的帮助
Markus我认为您的问题在于您创建了主记录,同时创建了详细记录。此时主记录没有有效的ID,发布后,它将获得一个有效的ID,您可以在详细记录中使用它。
根据我的经验,安全的方法是先创建主记录,发布它,然后添加详细记录您成功解决了这个问题吗?我也遇到过类似的问题,它似乎是fetchoptions模式参数。当设置为onDemand时,它使进程保持打开状态并等待。我通过将此设置为fetchall解决了我的问题,但是,缺点是查询需要更长的时间才能打开。感谢您的回复,但我想这是一个误解。我在TblToDo中已经有2条记录,只是通过调用TblToDo.Edit将recrod 1设置为EditMode。然后我开始通过TblToDoNotes.Append添加一条记录。在这一点上,一切都还可以。只有当有人通过呼叫TblToDoNotes开始在TblToDoNotes中添加另一个记录时,附加他的会话才会冻结。是的,可能是误解。我不明白为什么您需要在编辑模式下的TblToDo中设置记录,以便添加Notes记录(?这就是您的意思?)。你能展示一下你对这两张桌子的设计以及如何连接它们吗。我的直觉告诉我,这可能是问题的原因,没有必要在EditMode的TblToDo中设置一个记录来在TBLTODONETES中追加一个记录。但这实际上是用户所做的,我想了解在我描述的问题中这是如何运行的。如果用户已经在EditMode中获得了tbltodootes.Append的记录,那么很容易阻止“tbltodootes.Append”函数,但首先我想了解为什么这会造成如此大的问题。TblToDo获得了字段名称(nchar,40)和描述(nvarchar(max)),TblToDo获得了字段备注(nvarchar(max))和ToDoID(整数)。“ToDoID”通过引用完整性规则链接两个表。