Атомное поддержание счетчика с использованием подсомительного активации

StackOverflow https://stackoverflow.com/questions/2816234

Вопрос

Я пытаюсь выяснить правильный путь к атомированному увеличению счетчика в одной таблице и использовать это увеличенное значение в качестве идентификатора только Pseudo-дисплея для записи в другом.

То, что у меня есть таблица компаний и таблица рабочих мест. Я хочу, чтобы у каждой компании есть собственный набор job_numbers. У меня есть автоматическое увеличение JOB_ID, но эти цифры передаются всем компаниям. То есть: номера рабочих мест должны, как правило, увеличиваются без пробелов для каждой компании.

IE:

  • компании (Company_id, next_job_number)
  • Работа (Company_id, job_id, job_number)

В настоящее время я делаю это (как метод на частичном классе работы):

public void SaveJob()
{
    using (var scope = new System.Transactions.TransactionScope())
    {
        if (job_id == 0)
        {
            _db.Update<company>()
                .SetExpression("next_job_number").EqualTo("next_job_number+1")
                .Where<company>(x => x.company_id == company_id)
                .Execute();

            company c = _db.companies.SingleOrDefault(x => x.company_id == company_id);

            job_number = c.next_job_number;
        }

        // Save the job
        this.Save();

        scope.Complete();
    }
}

Кажется, работает, но я не уверен, есть ли здесь подводные камни? Это просто не так чувствует, но я не уверен, как еще сделать это.

Любые совет оценили.

Это было полезно?

Решение

Первый,

Вы должны использовать трансриалыCOPE в сочетании с SharedDBConnnectionsCope или ваша транзакция не будет работать должным образом.

Второй,

Я бы использовал другой подход с одним утверждением и без необходимости сохранять Job_id с компанией)

  1. Сохраните запись с помощью job_number = 0

  2. Обновите запись с чем-то вроде этого

    Обновите задания заданий job_number = (выберите max (job_number) +1 с работы, где Company_Id = 12345) где job_id = "+ this.job_id;

(Вам нужно только преобразовать этот запрос в Subsonic Syntax, я не использую Subsonic3), что должно гарантировать, что номер работы уникален для каждой компании (если вы обертываете команду сохранения и обновления в транзакции и используете замок таблицы) Отказ

Другие советы

Использование динамического кода для получения текущего наивысшего значения может быть рискованным (потенциальные дублирующие значения) на многопользовательской многопользовательской системе.

Еще один подход может быть создать новую таблицу с двумя колоннами; один символ pk, а другое целое число для хранения соответствующего последнего значения. Каждый раз, когда вы хотите новое значение, увеличивайте значение в записи для соответствующей компании и используйте это значение для вашего номера заказа. Персонаж PK будет содержать что-то вроде:

"LAST_ORDER_NUMBER_COMPANY_" + company_id

У меня есть сохраненная процедура, чтобы позвонить, которая автоматически либо начинает новую запись в первый раз, когда компания имеет заказ, или увеличивает его для последующих заказов и возвращает новое значение номера заказа.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top