2010-08-06 24 views
2

我有一個交易和交易表,交易表中有一個彙總列'TotalSales',它只是每筆交易的交易數。在隔離中更新彙總列問題

使用以下命令,是否有機會使事務行數和總銷售數不同步(不包括刪除行)?默認隔離級別是否適用於此?我們有很多用戶在同一時間進行購買,所以我試圖找出處理這個問題的最佳方法。

BEGIN TRANSACTION 
INSERT INTO [transaction] ... 

UPDATE deal 
SET TotalSales = (select count(*) from [transaction] where dealid = @dealId) 
WHERE dealId = @dealId 
COMMIT TRANSACTION 

回答

1

我對這樣的事情親景是使用一個觀點:

CREATE VIEW vw_sales AS 
AS 
     SELECT t.dealid, 
        COUNT(*) AS total_sales 
      FROM TRANSACTION t 
    GROUP BY t.dealid 

少些麻煩參與保持同步的數值,冗餘數據不存儲...

這只是因爲容易受到隔離級別問題的影響 - 默認情況是讀取提交的數據。讀取未提交的總銷售數據將爲Bad(tm)。

+0

促使我邁向一個總計專欄的原因之一就是對於交易的歷史觀點,顯示了總銷售額。只有最後一天才能進行交易,因此在給定日期範圍內針對所有交易進行彙總操作看起來有點浪費。 – Marco 2010-08-06 14:31:56

+0

@Marco:你爲什麼認爲聚合函數是浪費的? – 2010-08-06 14:48:31

+0

我認爲,出於性能方面的考慮,在具有數千條記錄的交易表上運行聚合(查看歷史數據)看起來可能需要一些非標準化。也許我會做一些*預優化*在這裏。你對這種情況的表現有什麼想法。基本上,主頁始終需要顯示交易的總銷售額以及顯示以前所有交易和總銷售額的歷史記錄頁面。 – Marco 2010-08-06 15:01:03