【问题标题】:Keep a transaction open on SQL Server with connection closed在连接关闭的情况下在 SQL Server 上保持事务打开
【发布时间】:2017-08-09 09:57:57
【问题描述】:

在 SQL Server 上,是否可以开始一个事务,但故意将其从打开的连接中孤立出来,同时阻止它回滚?

REST 服务的用例。

我希望能够链接一系列 HTTP 请求以在事务下工作,如果服务是有状态的,则可以这样做;即有一个 REST API 服务器保持打开的连接(将 HTTP 标头值映射到命名连接),但在非粘性网络服务器场中是一个有缺陷的想法。

如果数据库支持诸如命名/租用事务之类的概念,有点像命名互斥锁,则可以这样做。

我很欣赏其他针对原子数据突变的 RESTful 设计。

谢谢。

【问题讨论】:

  • 你是否使用一些应用服务器来处理请求?

标签: sql-server rest transactions


【解决方案1】:

没有。一个事务随着它创建的会话而生和死,一个会话随着它的连接而生和死。只要您愿意,您就可以让事务保持打开状态——但只能通过保持会话来保持连接,从而使连接保持打开状态。如果会话在事务提交之前关闭,它会自动回滚。一般来说,这是一件好事,因为事务倾向于使用悲观锁定。您不希望将这些锁保留超过必要的时间。

虽然有 distributed transaction 这样的东西,即使当前连接没有开始事务,您也可以加入,但对于多个分布式节点连续执行操作的场景,这仍然不能满足您的要求在一个数据库上完成事务。具体来说,您仍然需要有一个“主”节点来保持事务处于活动状态并决定它现在应该最终提交,并且您需要一种让节点知道事务的方法,以便它们可以登记。我不建议您实际上采用这种方式,因为它比为您的特定场景定制解决方案要复杂得多(通常,在他们自己的表中累积修改并在完成时将它们作为批处理提交,这可以在一笔交易)。

【讨论】:

    【解决方案2】:

    您可以使用面向队列的设计,其中应用程序只需添加到队列中,而 SQL 服务器代理“弹出”队列并执行。

    【讨论】:

    • SQL server agent 'pop's the queue and executes 有没有办法通过并行工作来处理队列中的许多任务?
    猜你喜欢
    • 2012-08-22
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多