2010-08-06 24 views
2

J'ai un accord et une table transaction, où la table d'opération a une colonne agrégée, « TotalSales », ce qui est tout simplement un nombre de transactions par transaction.Mise à jour de la colonne d'agrégat Dans l'isolement Question

Avec la commande suivante, est-il jamais une chance que le nombre de lignes de transactions et le nombre total des ventes ne seraient pas synchronisés (non compris la suppression de lignes)? Le niveau d'isolation par défaut fonctionne-t-il pour cela? Nous avons de nombreux utilisateurs effectuant des achats potentiellement en même temps, alors j'essaie de trouver la meilleure façon de gérer cela.

BEGIN TRANSACTION 
INSERT INTO [transaction] ... 

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

Répondre

1

Mon perference pour des choses comme celles-ci est d'utiliser une vue:

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

Moins de tracas liées à la tenue de la valeur de synchronisation, les données redondantes ne sont pas stockées ...

Il est juste comme sensible aux problèmes de niveau d'isolement - la valeur par défaut est de lire les données validées. La lecture des données non validées pour les ventes totales serait mauvaise (tm).

+0

L'une des raisons qui me conduisent vers une colonne agrégée est pour les vues historiques des transactions, montrant les ventes totales. Les offres ne durent qu'un jour, donc l'exécution d'un agrégat pour toutes les offres pour une période donnée, par exemple, semble un peu inutile. – Marco

+0

@Marco: Pourquoi pensez-vous que les fonctions agrégées sont un gaspillage? –

+0

Je pense que pour des raisons de performance, l'exécution d'un agrégat sur une table transactionnelle avec des milliers d'enregistrements (regardant les données historiques) semble être un peu dénormalisation peut être nécessaire. Peut-être que je fais un peu * pré optimisation * ici. Quelles sont vos pensées sur la performance pour ce scénario. Fondamentalement, la page d'accueil doit toujours montrer le total des ventes pour l'affaire et une page d'historique montrant toutes les offres précédentes et les ventes totales. – Marco