Где хранить счетчик для столбца другой таблицы? - PullRequest
0 голосов
/ 22 октября 2011

У меня есть требование к базе данных, которое немного искажает стандартную систему выставления счетов, которую вы видели в большинстве представлений БД. Моя система выставления счетов имеет несколько «офисов», которые не связаны между собой. Таким образом, соответствующие номера счетов отличаются для каждого офиса. Фактический номер счета-фактуры явно отличается от первичного ключа.

Например, офисы A и B могут иметь разные счета # 1005.

Есть ли лучший способ хранения счетчика для другого стола?

create table Offices (
    Id integer primary key,
    InvoiceCounter integer not null,
    Name varchar(32) not null
);

create table Invoices (
    Id int primary key,
    InvoiceNumber int not null,
    Comment varchar(512) not null
    -- other columns...
);

Это алгоритм, о котором я подумал при создании нового счета:

  1. Получить текущий счет InvoiceCounter для Office.
  2. Увеличьте на единицу и вставьте со счетом.
  3. Обновите Office, указав новый номер InvoiceCounter.

Имеет ли это смысл?

Ответы [ 2 ]

0 голосов
/ 22 октября 2011

Я думаю, вы хотите не блокировать явно, если можете.Только сделайте это в крайнем случае.Разве вы не можете просто повторить транзакцию, если транзакция не удалась из-за двух транзакций для одного и того же офиса с одинаковым номером счета?Отказавшая транзакция просто должна повторить попытку получения следующего доступного номера счета для данного офиса.

Это предполагает, что у вас есть уникальный ключ, который содержит № офиса и № счета.

0 голосов
/ 22 октября 2011

Одна вещь, с которой вам нужно позаботиться, это потенциальные условия гонки.Например, люди пытаются получить следующий Inv #, и они оба получают 1006 обратно.

Чтобы избежать этого, используйте sp_getapplock для блокировки при вычислении следующего числа

Причина, по которой это хорошая идея, заключается в том, что транзакции обычно не блокируют чтение,например, T1 читает 1005, но перед тем, как записать 1006, T2 также читает 1005. Когда T1 завершает транзакцию, T2 продолжает и также пишет 1006. Это приведет к сбою вашей транзакции, если ваш уникальный ключ правильный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...