2016-06-15 47 views
1

我有一種情況需要在事務內的存儲過程(sp_update_queue)中包裝更新T-SQL。但是我想知道如果你有兩個線程使用同一個連接但是執行不同的查詢並且一個回退它開始的事務會發生什麼。T-SQL存儲過程事務併發性

例如ThreadA中稱爲sp_update_queue更新表QUEUED_TASKSsp_update_queue提交/回滾之前,交易ThreadB執行一些其他的更新或插入SQL在不同的表,說CUSTOMERS。然後在ThreadB完成後,sp_update_queue碰巧遇到錯誤並調用回滾。

由於它們都使用相同的連接,回滾也會回滾由ThreadB?所做的更改,無論ThreadB是否在事務中進行更改。

+1

旁註:你應該** **不使用'sp_'前綴爲您的存儲過程。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你將來有可能冒着名字衝突的風險。 [這對你的存儲過程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是簡單地避免使用'sp_'並將其他內容用作前綴 - 或者根本沒有前綴! –

+0

'select @@ spid' from each「thread」。 –

+0

當你說「......他們都使用同一個連接......」時,你能澄清一下你的意思嗎? –

回答

0

每個首先獲取資源的線程都會鎖定該資源(如果您有合適的隔離級別),那麼第二個線程將等待所需的資源。

注意:每個線程都會有自己的SessionId。

修訂

在您的情況,但兩個線程都在使用相同的連接,但不要使用任何公共資源(的ThreadA是處理表X和ThreadB是處理表Y)。所以提交或回滾每個線程(線程A或B)不會影響另一個線程。

Read more about Isolation Level

+0

sp_update_queue將表更新爲調用的QUEUED_TASKS,但可以說ThreadB正在更新另一個表(Customers),因此不需要等待。在這種情況下會發生什麼?我已更新我的帖子以澄清情況 –