簡體   English   中英

酸並發隔離級別vs ROWVERSION

[英]ACID concurrency ISOLATION LEVEL vs ROWVERSION

我正在sql server 2012上測試並發性,並使用實體框架。

我注意到並發主要可以通過以下方式之一控制:

  1. 設置事務隔離級別[可重復讀取|可序列化| ...]
  2. 在表上創建一個ROWVERSION列

據我了解,第一種方式使用數據庫日志和鎖,而第二種方式使用Rowversion值的基本比較。

如果我說的是錯誤的,請糾正我。

最佳選擇是什么? 我應該同時使用它們還是只堅持使用它們?

通常,每個dbcontext saveChanges()包含在數據庫transaction中 我們正在討論在不同級別上處理並發:在saveChanges上和幾個dbcontext saveChanges之間進行數據庫事務:

  • 數據庫層 :數據庫能夠處理實時交易的隔離。 您可以使用set transaction isolation level命令更改隔離級別。

  • 實體框架層 :EF能夠保持從一個事務到另一個事務的並發性,只需知道其他用戶是否更改了您的數據即可。 它們有兩種方式:

    • 在更新和刪除命令的Where子句中,配置實體框架以使其包含表中每列的原始值。 與第一個選項一樣,如果自從首次讀取該行以來該行中的任何內容發生了變化,Where子句都不會返回要更新的行,實體框架將其解釋為並發沖突。 對於具有許多列的數據庫表,此方法可能會導致很大的Where子句,並且可能要求您維護大量狀態。

    • 在數據庫表中,包括一個跟蹤列,可用於確定何時更改了行。 然后,您可以配置實體框架以在SQL Update或Delete命令的Where子句中包括該列。 跟蹤列的數據類型通常是rowversion

這是MVC的旅程:

db.Entry(departmentToUpdate).OriginalValues["RowVersion"] = rowVersion;

報價和詳細信息: http : //www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/handling-concurrency-with-the-entity-framework-in-an -Asp凈MVC應用程序

SQL Server通過遵守ACID屬性來維護數據完整性和系統穩定性,ACID屬性是原子性,一致性,隔離性和持久性的首字母縮寫。

該首字母縮略詞的隔離部分指出,所有事務都彼此隔離地運行,並且沒有兩個資源可以同時更新相同的數據或SQL對象的定義。 在悲觀的隔離級別(未提交讀,已提交讀,可重復讀和可序列化)中,此操作由鎖定控制。 在樂觀隔離級別(“讀取已提交的快照”和“快照”)中,這由行版本控制。

摘自https://simonlearningsqlserver.wordpress.com/2013/11/15/locking-blocking-and-isolation-levels/

暫無
暫無

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

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