Delphi / SQL Server:用于清除记录的唯一会话标识符

时间:2013-07-09 07:13:19

标签: sql-server delphi record delphi-xe3

我们希望在程序中使用ADOConnection

在其他软件中,我们可以在实际会话中使用“session”(连接)id,我们也可以列出实际(其他)连接。

如果程序未正确终止,我们使用此功能清除特殊表中的永久数据。

有时我们使用真实记录来签名。在以前的数据库中,我们有更多选项来清除它们。

  1. 同一连接中另一个持有记录的事务和“nowait”选项来检查真正的锁(是否存在)。

  2. 数据库级触发器(连接时,断开连接时)清除某些内容。

  3. 唯一会话ID +访问会话列表以确定会话是否存在。

  4. 在会话结束时删除的全局(但基于会话的)对象,但我们可以检查它们的存在。

  5. 在SQL Server中我不知道如何做到这一点。正如我在这个DB中看到的那样:

    一个。) 我们没有真正唯一的会话ID。

    湾) 我们没有公共临时表,其记录将在会话结束时删除。

    下进行。) 我们不会列出以某种方式链接实际会话的连接会话(连接)(通过id,通过某些东西来改变相同的用户名而不是另一个应用程序)。

    d。) ADO通过连接有一个事务,并且事务似乎是阻塞的。我们不希望仅将此功能的连接加倍。

    予。) 正如我所看到的,只有全局临时表可以提供帮助,如果名称可以包含tablename + keyvalue。

    例如:

    “bill_head_ID28338328”表存在是某人锁定密钥28338328的意思(签名)。

    如果此连接异常终止,那么全局临时表将在最后消失。

    II。) 或者,如果我有一个名为“living_connections”的表,那也是一回事。

    每个连接都将基于GUID的id插入此表中+创建一个名为“LIVCON_”+ GUID的全局临时表。

    通常,程序会从最后的“living_connections”中清除自己的记录。 但我们有一个“自动调节”功能。

    这可以列出living_connections,并检查具有相同GUID的所有全局临时表。 如果它找不到它,那意味着连接以某种方式死亡。

    然后我们可以清除此记录以及所有链接的记录。

    但也许这是一个错误的想法。

    你怎么看?你有什么好主意来检查活着和什么连接 永久性标志有效吗?

    感谢您提供任何帮助,推进,链接等。


    一些扩展: MS-SQL服务器可能使用TCP / IP(套接字)连接参数来确定哪个客户端处于活动状态。如果连接异常死亡,服务器可能会使用默认的keepalive参数,即2小时......: - (

1 个答案:

答案 0 :(得分:0)

MS SQL具有SPID + ConnectionTime。 这些混合值足够独特,可以将它们用作键,并检查哪些会话数据存活,哪些会死...