Deadlock
為什麼在這種情況下會出現僵局?
我在網上瀏覽了死鎖異常的例子,發現了這個連結
據我了解,這裡我們有兩個程序(會話 1 和 2)。第一個在 pd1 上獲取鎖,第二個在 pd2 上獲取。然後在那之後,第一個要從 pd2 中讀取,第二個要從 pd1 中讀取。
我不明白為什麼我們會在這裡陷入僵局。它不會以會話更新的方式工作,一旦完成更新,它將釋放 pd1 上的鎖定,並且會話 2 將能夠從 pd1 讀取。反過來也一樣?為什麼更新 + 選擇在這裡必須是單個操作?
是不是因為它們是同一個事務的一部分,因此在事務中他們不會放棄在任何對像上獲得的鎖?
Sybase ASE 使用阻塞鎖進行事務隔離,這意味著讀取器阻塞寫入器,寫入器阻塞讀取器(與其他使用版本控制的數據庫不同,因此寫入器不會阻塞讀取器,反之亦然)。
因此,每個 SELECT 都被它從中選擇的表上的較早 UPDATE 取出的排他鎖阻塞,因為該更新是由不同的會話完成的(如果它是同一個會話,它不會阻塞)。由於現在兩個 SELECT 都無法繼續,因此存在死鎖。