Sql server T-SQL存储过程事务并发性

Sql server T-SQL存储过程事务并发性,sql-server,tsql,concurrency,transactions,Sql Server,Tsql,Concurrency,Transactions,在这种情况下,我需要在事务内部的存储过程(sp\u update\u queue)中包装一个更新T-SQL。但是我想知道如果有两个线程使用相同的连接但执行不同的查询,其中一个回滚它启动的事务,会发生什么情况 例如,ThreadA调用sp\u update\u queue来更新表QUEUED\u TASKS,但在sp\u update\u queue提交/回滚之前,事务ThreadB在不同的表上执行一些其他更新或插入SQL,例如CUSTOMERS。ThreadB完成后,sp_update_queu

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

例如,ThreadA调用
sp\u update\u queue
来更新表
QUEUED\u TASKS
,但在
sp\u update\u queue
提交/回滚之前,事务ThreadB在不同的表上执行一些其他更新或插入SQL,例如
CUSTOMERS
。ThreadB完成后,
sp_update_queue
碰巧遇到错误并调用rollback


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

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

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

已更新

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


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

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

已更新

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


sp_update_queue将一个表更新为被调用的排队任务,但假设ThreadB正在更新另一个表(客户),因此不需要等待。在这种情况下会发生什么?我更新了我的帖子,以澄清场景sp_update_queue将一个表更新为所谓的排队任务,但假设ThreadB正在更新另一个表(客户),因此不需要等待。在这种情况下会发生什么?我已经更新了我的帖子,以澄清场景提示:您不应该在存储过程中使用
sp_u
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀<代码>从每个“线程”中选择@@spid。当您说“…它们都使用相同的连接…”时,您能澄清一下您的意思吗?旁注:您不应该在存储过程中使用
sp
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀<代码>从每个“线程”中选择@@spid。您能澄清一下您所说的“…它们都使用相同的连接…”是什么意思吗?