【问题标题】:T-SQL stored procedure transaction concurrencyT-SQL 存储过程事务并发
【发布时间】:2016-06-15 23:02:22
【问题描述】:

我有一种情况,我需要在事务内的存储过程 (sp_update_queue) 中包装更新 T-SQL。但是我想知道如果您有两个线程使用相同的连接但执行不同的查询并且一个回滚它启动的事务会发生什么。

例如 ThreadA 调用 sp_update_queue 来更新表 QUEUED_TASKS 但在 sp_update_queue 提交/回滚之前,事务 ThreadB 执行其他一些更新或在不同的表上插入 SQL,例如 CUSTOMERS。然后 ThreadB 完成后,sp_update_queue 恰好遇到错误并调用回滚。

因为它们都使用相同的连接,所以回滚是否也会回滚 ThreadB 所做的更改?无论 ThreadB 是否在事务中进行了更改。

【问题讨论】:

标签: sql-server tsql concurrency transactions


【解决方案1】:

首先获取资源的每个线程都会锁定该资源(如果您有合适的隔离级别),因此第二个线程将等待所需的资源。

注意:每个线程都有自己的 SessionId。

更新

在您的场景中,但是两个线程都使用相同的连接,但不使用任何公共资源(ThreadA 正在处理表 X,而 ThreadB 正在处理表 Y)。因此,每个线程(线程 A 或 B)的提交或回滚不会影响另一个。

Read more about Isolation Level

【讨论】:

  • sp_update_queue 将表更新为名为 QUEUED_TASKS 但可以说 ThreadB 正在更新另一个表(客户),因此不需要等待。在这种情况下会发生什么?我已经更新了我的帖子以澄清情况
猜你喜欢
  • 2018-10-03
  • 2013-05-28
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
相关资源
最近更新 更多