簡體   English   中英

SQL 如何處理多個進程同時將同一條記錄寫入同一個數據庫表?

[英]How SQL would handle multiple process writes the same record into the same database table simultaneously?

這是我長期以來的困惑。 如果多個進程同時將相同的記錄寫入同一個數據庫表中,它們會發生沖突嗎?

一個類似的問題,例如,一台主機不斷地將請求分發給許多其他機器,例如,將一條記錄插入到機器 A 的表中。 不知何故,此操作在機器 A 上非常緩慢,主控制器將向機器 B 重新發送完全相同的請求。 那么會發生什么? 會有沖突嗎?

其實有兩個問題,但我會盡量回答主要的一個。

首先,我們在談論什么樣的數據庫? 如果是像 Oracle、PostgreSQL、MSSQL 等現代 RDBMS,那么它很可能具有逐行鎖定機制,這意味着每個進程可以同時插入/更新/刪除行,只要它們不相互交叉即可。

一旦發生兩個進程試圖更新同一行,一個進程(幸運的是第一個)將更新該行,而第二個進程將不得不等到第一個進程提交或回滾其事務。 這個更新的行現在被任何進程的任何更改鎖定,但第一個除外。

如果第一個進程刪除一行,也會發生同樣的事情。 在第一個提交或回滾事務之前,沒有其他進程可以插入具有相同唯一鍵的新行。

現在,當我們看到兩個進程插入具有相同唯一鍵的行時變得更有趣,如果讓它們都完成,將破壞關系模型。 表中還沒有行,因此沒有要鎖定的內容。 但是,某處有一個索引可以提供唯一性。 因此,進程實際上會嘗試鎖定索引的存儲桶,而不是鎖定行。 最初的過程將會成功。 現在,當第二個進程嘗試插入一行時,它將看到存儲桶已鎖定。 與第一種情況一樣,第二個進程必須等到桶被釋放,然后檢查是否可以插入並為自己鎖定桶。

這實際上是一個非常膚淺和籠統的解釋,但它提供了沖突解決機制如何工作的概念。 實際實現可能因數據庫而異,並且要復雜得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM