【问题标题】:When using a SQL Transaction, how long can I keep it open without causing a problem使用 SQL 事务时,我可以在不引起问题的情况下保持打开多长时间
【发布时间】:2022-07-27 22:11:49
【问题描述】:

我有一个托管在 Azure 上的 Web 应用程序。它有一个复杂的注册表单,允许用户租用储物柜,添加配偶会员资格等。我不想在该页面上的所有内容完成并结帐之前将记录添加到数据库中。我正在使用 SQL 事务,以便我可以将记录添加到各种表中,然后如果用户没有正确完成条目,或者只是退出页面,则将它们回滚。我不希望我的数据库中有一堆孤立的记录。最终将添加的所有记录通过每个表上的标识字段相互引用。因此,如果我不向表中添加记录,我就不会获得返回以在其他表中引用的标识。

在页面的开头,我打开一个 SQL 连接并将其与一个事务相关联,并保持事务处于打开状态直到流程结束。如果一切顺利,我会提交交易、发送电子邮件等。

我知道最佳做法是尽快打开和关闭 SQL 连接。在不打开 SQL 连接和事务并将其保持打开状态直到进程结束的情况下,我不知道有任何其他方法可以操作此页面。

如果我不应该这样做,其他人怎么做?

【问题讨论】:

  • 我会使用某种类型的应用程序或浏览器状态来跟踪这一点,然后在最后提交完成的请求(会话存储或本地存储是选项)。另一种选择是保留状态服务器端但不在最终表中,您可以为此使用一组不同的表,也可以将不同的数据库或存储一起使用(如 no-sql 解决方案甚至是平面文件)。这样您就不会污染决赛桌,也不需要长期持有的事务,该事务可以锁定其他请求的记录并在以后导致性能问题、竞争条件和其他问题。
  • 将要提交的信息存储在变量中,然后当用户单击完成/保存时,您将其全部保存在事务中。不要长时间持有事务(超过几秒钟,最好更短),这可能会导致严重的阻塞问题。如果您可以在所有服务器端(在存储过程中)打开并提交事务,那就更好了

标签: sql-server


【解决方案1】:

我在这里看到两个问题,一个是关于我将如何做,另一个是关于数据库的限制。从第二个开始,事务的超时取决于您的连接字符串超时。因此,如果连接仍然存在,您可以完成提交或回滚。

关于如何做,我不会那样做。将数据库关键锁定过程链接到用户交互是一种非常糟糕的方法。你把性能交到你的用户手中,而且,你假设 goog 有意向的客户,但你也会有坏人。

我会将信息本地存储在网络浏览器中,如果该过程完成,则将信息发送到数据库以提交它。所以最终的“POST”会创建所有的项目,这也需要一些时间。

如果您想保留它的服务器端,另一种选择是使用 Redis 服务器来缓存信息,然后在进程完成后将其“移动”到数据库中。

【讨论】:

    猜你喜欢
    • 2016-07-15
    • 2021-05-11
    • 2016-01-05
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    相关资源
    最近更新 更多