Одновременное чтение пользователем и обновление до mysql с помощью C#

У меня есть проблема в моей программе, решив эту проблему, возможно, это можно сделать с помощью одноэлементного метода. Но, как я прочитал из какой-то статьи, они сказали, что это не очень хороший способ реализовать это, так как одновременных пользователей приложения asp.net может быть много.

Моя проблема заключается в том, что номер системы работает на основе конкретной записи в примере базы данных:

  • document_type = "INV", document_year = 2015, document_month = 04, document_running = 0102.
  • document_type = "INV", document_year = 2015, document_month = 05, document_running = 0002.

Поэтому, когда пользователь создает новую запись, логика получения нового рабочего номера, как показано ниже:

  1. Получить документ type = "inv", текущий год и текущий месяц,
  2. Если не найден. создайте новый тип документа, запись года и месяца с порядковым номером 0001.
  3. если найден работает + 1.

Теперь проблема выходит. В моей ситуации 5 пользователей получили информацию о записи, как при нажатии кнопки "Сохранить" для создания новой записи: - document_type="INV", document_year=2015, document_month=05, document_running=0002.

и 5 пользователей получают один и тот же рабочий номер INV15-05-0003 (после 0002 + 1). По праву должны быть INV15-05-0003, INV15-05-0004, INV15-05-0005, INV15-05-0006 и INV15-05-0007.

как мы должны сделать, чтобы все пользователи не получали неверную / устаревшую информацию. Надеюсь, вы все сможете понять на моем плохом английском. С уважением, MH

2 ответа

Решение

Единственный способ, который я вижу, - это использовать блокировку метода, который вы вызываете, для управления базой данных.

public class Dal
{
    private static object syncObject = new object();

    public static void InsertUpdate(...) 
    {
        lock (syncObject)
        {
            // 1. Get the document type = "inv" , current year and current month,
            // 2. If not found. create a new document type , year and month record with the running number 0001.
            // 3. if found. running + 1.
        }
    }
}

Простейший способ приблизиться к желаемому эффекту - использовать поле "Автоинкремент для поля document_running": https://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html.

Предупреждение: имейте в виду, что в этом случае ваш document_running всегда будет уникальным для всех документов, а не только для записей с одинаковым типом / год / месяц.

Альтернативное решение: используйте GUID в качестве поля document_running. Это же предупреждение относится.

Другие вопросы по тегам