2013-11-27 25 views
1

出於某種原因,我們有這樣的代碼(過程中),在SQL Server 2008 R2的:SQL事務和外部調用僵局

update foo set value = 'xxx' where id = 123 
exec usp_analyzeFoo @id = 123 

其中usp_analyzefoo召喚出連接到數據庫上的Web服務它自己並嘗試自行更新表foo。該Web服務使用本地代碼,連接到硬件 (所以我不想讓這個代碼在SQL服務器內運行)等等,工作出來並更新foo。但它是由不同的連接和當前事務之外的。

它一直工作,直到有人將這些調用包含在事務中,並且現在update命令鎖定表foo,並且Web服務(通過它自己的數據庫連接進行連接)被此事務阻塞並超時。

這是否有合理的解決方案?在當前事務結束後調用Web服務,在幾秒鐘後調度它(這不重要)或類似的東西?

+0

首先明顯的問題 - 交易是否承諾? –

+0

是的,但只有在所有這些完成後纔會完成(這從未發生過,因爲Web服務被打開的事務阻塞) – Axarydax

+1

您可以調用SQL Server代理'作業',它將異步調用Web服務(然後運行即使事務最終回滾)。 –

回答

0

您可以將該職位稱爲Justicator評論的職位,或者您可以將該職位分配到兩個單獨的交易中。

如果您沒有在事務中明確包裝這兩個操作,它們本身就會在隱式事務中執行。

update -- implicit tran 
exec SP -- implicit tran 

,當你把它包你的意思是在原子TRAN,由於該SP被調用第三方WS,並嘗試做另一個事務不起作用做這兩種操作。

begin tran 
update 
exec SP -- call a third party ill be blocked by that update cuz it's not committed yet 
commit tran -- ill never reach this point since exec does not complete, its a deadlock baby 

如果你願意,你可以分開交易,他們生病就像之前(壞)換行。

begin tran 
update 
commit tran 

begin tran 
exec SP 
commit tran