2010-08-06 3 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

Мой perference для таких вещей, как они есть, чтобы использовать вид:

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

Меньше хлопот участвует с сохранением значения в синхронизации, избыточные данные не хранятся ...

Это просто как подверженные проблемам уровня изоляции - по умолчанию используется чтение данных. Чтение незафиксированных данных для общих продаж было бы плохим (tm).

+0

Одна из причин, побуждающих меня к объединенной колонке, - это исторические взгляды на сделки, показывающие общий объем продаж. Делает только последний день, поэтому запуск агрегата для всех сделок для определенного диапазона дат, например, кажется немного расточительным. – Marco

+0

@Marco: Почему вы считаете, что агрегатные функции являются расточительными? –

+0

Я думаю, что по соображениям производительности выполнение агрегата над транзакционной таблицей с тысячами записей (просмотр исторических данных) кажется, что может потребоваться небольшая де-нормализация. Может быть, im doin немного * предварительная оптимизация * здесь. Каковы ваши мысли о производительности для этого сценария. В основном, домашняя страница всегда должна показывать общий объем продаж для сделки и страницу истории, показывающую все предыдущие сделки и общие продажи. – Marco

Смежные вопросы