Одновременное чтение пользователем и обновление до 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.
Поэтому, когда пользователь создает новую запись, логика получения нового рабочего номера, как показано ниже:
- Получить документ type = "inv", текущий год и текущий месяц,
- Если не найден. создайте новый тип документа, запись года и месяца с порядковым номером 0001.
- если найден работает + 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. Это же предупреждение относится.