2012-11-16 29 views
1

在這種情況下,我應該將數據庫分成兩部分嗎?SQL Server:在表B執行CRUD時修改表A?

方案

雖然客戶創建,編輯,保存訂單在Order表,網站所有者調用存儲過程來改變在Email表表格屬性。

更新

唯一的關係Order表與電子郵件表是用戶ID(FK電子郵件上表)。那麼,如果WHILE客戶下訂單,會產生什麼後果,我同時在電子郵件表中添加一個可以爲空的「CcAddressId」列。這個訂單成功會發生問題嗎?

問題:

  • 要麼有一個潛在的錯誤,如果同時出現的這些事件?
  • 將數據庫分解成組會更好嗎?
+0

這些表如何相關?是否可以編輯任一表中的鍵?有關這些主題的更多信息以及這些表格的結構可能會幫助您獲得更好的答案。 –

+1

這是數據庫的目的。沒有兩件修改相同數據的事件會實際上完全同時發生;數據庫確保它們總是以某種順序發生,因此底層數據始終保持一致。這是通過事務和記錄/表鎖定自動完成的。 – mellamokb

+0

實體框架(即單個DbContext/ObjectContext)不能同時與兩個數據庫一起使用。除了@mellamokb說的你可能想要使用樂觀併發來確保你沒有壓倒一切。檢查這個博客(這有點過時,但仍應該作爲出發點)http://blogs.msdn.com/b/alexj/archive/2009/05/20/tip-19-how-to-use-optimistic -concurrency-in-the-entity-framework.aspx並使用bing或google搜索「實體框架併發性」以查找更多信息。 – Pawel

回答

2

簡短的回答並不是將數據庫分成兩部分,因爲您將失去外鍵強制的參照完整性,更別提上面提到的其他問題了。 你需要做的是找出當你將數據插入Orders表時,SQL Server是否會爲你的EMails表發出任何類型的鎖。 你可以嘗試,並以此爲起點,找出自己:

http://aboutsqlserver.com/2012/04/05/locking-in-microsoft-sql-server-part-13-schema-locks/

改變表將嘗試發出模式修改鎖(SCH-M),這是任何其他類型的鎖不兼容。因此,如果表中有任何活動正在被修改(我認爲會因爲外鍵約束被驗證),您的模式修改語句將被阻塞很長時間。

這就是爲什麼當數據庫不在重負載下運行模式更改語句會更好。

相關問題