在SQL Server上,是否可以开始一个事务但是有意从开放连接中删除它但仍然不能回滚?
用于REST服务的用例。
我希望能够将一系列HTTP请求链接到事务下工作,如果服务是有状态的,可以这样做;即,有一个REST API服务器保持连接打开(将HTTP标头值映射到命名连接),但在非粘性Web服务器场中存在缺陷。
如果数据库支持像命名/租用事务这样的概念,有点像命名互斥,那就可以做到。
我很欣赏原子数据突变还有其他RESTful设计。
感谢。
答案 0 :(得分:1)
没有。交易在其创建的会话中生存和消亡,并且会话与其连接一起生存和死亡。您可以根据需要保持事务处于打开状态 - 但只能通过保持会话,从而打开连接。如果会话在事务提交之前关闭,它会自动回滚。一般来说,这是一件好事,因为交易倾向于使用悲观锁定。你不想让这些锁定的时间超过必要的时间。
虽然即使当前连接没有开始事务,也可以登记distributed transaction这样的事情,但对于多个分布式节点执行操作的场景,这仍然无法实现。继承在一个数据库上完成一个事务。具体来说,你仍然需要一个" master"节点保持事务处于活动状态并确定它现在应该最终提交,并且您需要一种方法使节点知道事务以便它们可以登记。我不建议您实际采用这种方式,因为它比为您的特定方案定制解决方案要复杂得多(通常,在他们自己的表中累积修改并在他们的时候将它们作为批处理提交)。重新完成,可以在一次交易中完成。)
答案 1 :(得分:0)
您可以使用面向队列的设计,其中应用程序只是添加到队列中,而SQL Server代理'弹出队列并执行。