【发布时间】:2015-04-14 17:12:15
【问题描述】:
我有一个 aspx.vb 程序,它检查表以查看会话是否存在,如果不连接到我们的 ECM 软件,则使用许可证,并使用会话信息更新表。如果用户尝试再次登录,它应该会找到现有会话并且仍然只使用一个许可证。
这在 99% 的时间都有效,除了偶尔用户会消耗 2 个许可证但只在表中创建一行,这反过来会留下一个重复的会话,该会话陷入困境,必须手动断开连接才能释放许可证。
我添加了日志记录并按应有的方式命中代码,并且变量正在传递正确的值。在与数据库建立连接之前,代码是否可能在逻辑中运行得太快?
lvSql = "insert into OnBase_Sessions values (@dbSeqNum,@SID,@UName,@LastActivity,@ccSeqNum)"
x = New sqlCmds(lvSql, "ONBASEAPI")
x.addIntParameter("@dbSeqNum", SqlDbType.Int, 4, lvDataSourceSeq)
x.addStrParameter("@SID", SqlDbType.VarChar, 40, lvSession)
x.addStrParameter("@UName", SqlDbType.VarChar, 15, user.userName)
x.addStrParameter("@LastActivity", SqlDbType.DateTime, 0, System.DateTime.Now)
x.addIntParameter("@ccSeqNum", SqlDbType.Int, 4, lvClientCodeSeq)
x.exeNonQuery()
【问题讨论】:
-
尝试在使用许可证之前先更新表(如果无法获得许可证,当然删除该记录)。您没有在您的 aspx 页面中向我们展示您的逻辑,因此很难找出发生了什么。如果您没有正确处理您的 aspx 页面,它可能会进行双重回发。
-
看起来您的问题不仅仅是 SQL。根据您的描述,在某些情况下,用户再次登录,数据库尚未提交第一次写入,因此使用了新的许可证,并且在写入时数据库意识到该行已经存在。也许您需要检查插入实际上是否导致创建新行或重复错误?还是先在 SQL 中创建会话,然后使用许可证?
-
如果您展示如何检查会话是否存在以及该查询相对于插入语句的排序方式,将会有所帮助。
-
我无法先更新表,因为我需要连接并使用许可证才能获取会话信息。我认为添加支票可能是我最好的选择。
-
更新:所以我知道发生了什么,但不太明白为什么。如果两个用户同时登录但针对不同的客户端。较慢的连接 SQL INSERT 混合了来自第一次点击应用程序的用户的用户参数。示例:用户 1 SPOT 客户端代码:SP 会话:12345 和用户 2 TSP 客户端代码:TP 会话:6789。 USER 2 is INSERTing TSP, SP, 6789,不正确
标签: sql asp.net vb.net sql-insert