2010-09-02 30 views
0

我正在使用PowerShell事務;它使用Serializable的IsolationLevel創建一個CommittableTransaction。問題是,當我在此上下文中執行事務時,除了執行事務的連接之外的任何連接,所有SELECT都被阻塞在受事務影響的表上。我可以在交易中執行獲取,但不能在其他任何地方執行。這包括SSMS和其他cmdlet執行。這是預期的行爲?好像我失去了一些東西......將IsolationLevel設置爲Serializable的TransactionScope鎖定了所有SQL SELECT

PS腳本:

Start-Transaction 
Add-Something -UseTransaction 
Get-Something #hangs here until timeout 
Add-Something -UseTransaction 
Undo-Transaction 

回答

6

可串行化事務將阻止在此隔離下掃描範圍內的任何更新。本身串行隔離級別不會阻止讀取。如果您發現讀取被阻止,則必須發揮其他功能,這取決於您在這些腳本中所做的操作。

+0

設置READ_COMMITTED_SNAPSHOT似乎解決了這個問題。我不確定這是否是一個有效的解決方案...... – 2010-09-02 16:07:02

+0

這意味着你正在PS腳本中進行更新。這些更新會鎖定數據,但是現在,當SSMS和其他查詢請求讀取已提交(即=默認情況下)時,它們將在快照下運行,以便他們可以看到舊版本的數據(來自PS更新之前的圖像)。 – 2010-09-02 16:09:28

+0

好的。所以如果有可能改變IsolationLevel來說,ReadCommited,這會改變行爲嗎? – 2010-09-02 16:14:17

2

聽起來好像你的數據庫有ALLOW_SNAPSHOT_ISOLATION = OFF。此設置控制由數據庫使用的併發機制:

  • ALLOW_SNAPSHOT_ISOLATION = OFF:這是SQL Server的傳統模式,以基於鎖併發。此模式可能會導致鎖定問題。

  • ALLOW_SNAPSHOT_ISOLATION = ON:這是自SQL Server 2005起使用並使用MVCC,與Oracle或Postgresql非常類似。這對於併發性更好,因爲讀者不會阻止編寫者,編寫者也不會阻止讀者。

注意,這兩種模式不以同樣的方式表現,所以你必須承擔一個模式或其他代碼您的交易。

+0

這似乎沒有幫助。 :| – 2010-09-02 15:55:10

相關問題