【发布时间】:2022-07-27 22:11:49
【问题描述】:
我有一个托管在 Azure 上的 Web 应用程序。它有一个复杂的注册表单,允许用户租用储物柜,添加配偶会员资格等。我不想在该页面上的所有内容完成并结帐之前将记录添加到数据库中。我正在使用 SQL 事务,以便我可以将记录添加到各种表中,然后如果用户没有正确完成条目,或者只是退出页面,则将它们回滚。我不希望我的数据库中有一堆孤立的记录。最终将添加的所有记录通过每个表上的标识字段相互引用。因此,如果我不向表中添加记录,我就不会获得返回以在其他表中引用的标识。
在页面的开头,我打开一个 SQL 连接并将其与一个事务相关联,并保持事务处于打开状态直到流程结束。如果一切顺利,我会提交交易、发送电子邮件等。
我知道最佳做法是尽快打开和关闭 SQL 连接。在不打开 SQL 连接和事务并将其保持打开状态直到进程结束的情况下,我不知道有任何其他方法可以操作此页面。
如果我不应该这样做,其他人怎么做?
【问题讨论】:
-
我会使用某种类型的应用程序或浏览器状态来跟踪这一点,然后在最后提交完成的请求(会话存储或本地存储是选项)。另一种选择是保留状态服务器端但不在最终表中,您可以为此使用一组不同的表,也可以将不同的数据库或存储一起使用(如 no-sql 解决方案甚至是平面文件)。这样您就不会污染决赛桌,也不需要长期持有的事务,该事务可以锁定其他请求的记录并在以后导致性能问题、竞争条件和其他问题。
-
将要提交的信息存储在变量中,然后当用户单击完成/保存时,您将其全部保存在事务中。不要长时间持有事务(超过几秒钟,最好更短),这可能会导致严重的阻塞问题。如果您可以在所有服务器端(在存储过程中)打开并提交事务,那就更好了
标签: sql-server