Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server mssql服务器上的delphi xe7 firedac锁定_Sql Server_Delphi_Locking_Firedac - Fatal编程技术网

Sql server mssql服务器上的delphi xe7 firedac锁定

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表。连接具有锁模式

我在FireDAC和mssql服务器上的锁定方面遇到了一些奇怪的问题,不知道这是怎么发生的。所以我希望任何有经验的人都能帮助我:)

我们的情况如下: 在我们的应用程序中,有一个表ToDo和一个表ToDoNotes。两者都有主唯一键ID,它们通过ToDoNotes.ToDoID链接。 表ToDo用于写下下下一个任务,表ToDoNotes用于对每个任务留下注释。因此,表ToDo中的多条记录可以用于表ToDo中的一条记录。我们使用FireDac表组件FDTable连接到这些mssql表。连接具有
锁模式悲观
锁点立即

以下步骤将整个表锁定为DONOTES,我不知道原因:

第一节课:

  • TblToDo.编辑记录1
  • TblToDoNotes.Append to为TblToDo记录1追加一条记录
  • 所以这两个表现在都处于编辑模式

    第二课时:

  • TblToDoNotes.Append
  • 此时,应用程序(会话二)处于冻结状态,直到在会话一中执行
    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”通过引用完整性规则链接两个表。