Sql-Server

使用聯合時的表鎖定

  • December 4, 2018

當在 a 中使用多個選擇時,是單獨處理UNION/UNION ALL每個單獨SELECT語句的表鎖還是在所有SELECT語句完成之前保持所有表鎖?

例如,100 個單獨的 select 語句通過UNION/UNION ALL. (假設它們是按順序解決的)如果SELECT事務中的第一個事務完成並且不同會話中的另一個事務嘗試訪問相同的數據,數據是否仍然被鎖定UNION

我只是想了解UNIONs物理表仍在執行時的行為方式。

UNION對於提示這一點的查詢, (Not UNION ALL)中有 7 個不同的語句。帶著這個特殊的問題,我只是想了解後端架構是如何UNION/UNION ALL工作的。提示這個問題的查詢會導致很多阻塞,但只執行大約一分鐘,所以我試圖了解是整個查詢導致它還是只是幾個單獨的部分。

我在這裡添加了一個後續問題:Backend Table/Row Locking Structure using CTE Queries

所有select .. union .. select ..位都算作一個語句。我在文件中找不到文章來證明這一點,但我可以提供支持證據。

首先,分號是Transact-SQL 語句終止符。您的查詢中只有一個地方會被接受,那就是最後一個SELECT. 其次,執行計劃由一棵樹組成,表示一條語句。相反,作為單個批次送出的兩個查詢將導致兩個不相交的執行樹。

如果存在顯式事務,則select..union成為該事務的一部分,並且鎖定將一直保留到COMMITor ROLLBACK。如果您有一個隱式事務,我的意思是自動送出,而不是SET IMPLICIT_TRANSACTIONS,它跨越所有選擇。鎖將被持有多長時間,它們會被UNION隔離級別、查詢選項(TABLOCKX等)、鎖升級、跟踪標誌以及所有其他影響這一點的事物控制。

引用自:https://dba.stackexchange.com/questions/223862