Я создаю сайт ASP.NET MVC 2, который использует LINQ to SQL. Я думаю, что в одном из мест, где мой сайт обращается к БД, возможно состояние гонки.
БД Архитектура
Вот некоторые из столбцов соответствующей таблицы БД с именем Revisions
:
- RevisionID - bigint, IDENTITY, PK
- PostID - бигинт, ПК для ПК
Posts
таблица
- EditNumber - int
- RevisionText - nvarchar (max)
На моем сайте пользователи могут отправлять сообщения и редактировать сообщения позже. Пользователи, отличные от оригинального постера, могут редактировать сообщение, поэтому есть возможность для нескольких изменений в одном сообщении одновременно.
При отправке сообщения создается запись в таблице Posts
, а также запись в таблице Revisions
с PostID , установленным на идентификатор записи Posts
, RevisionText установлен в текст сообщения, а EditNumber установлен в 1.
При редактировании сообщения создается только запись Revisions
, с EditNumber , установленным на 1 больше, чем последний номер редактирования .
Таким образом, столбец EditNumber указывает, сколько раз редактировалось сообщение.
Увеличение EditNumber
Проблема, которую я вижу при реализации этих функций, заключается в увеличении столбца EditNumber . Поскольку этот столбец не может быть IDENTITY , я должен манипулировать его значением вручную.
Вот мой запрос LINQ для определения того, какой EditNumber должна иметь новая ревизия:
using(var db = new DBDataContext())
{
var rev = new Revision();
rev.EditNumber = db.Revisions.Where(r => r.PostID == postID).Max(r => r.EditNumber) + 1;
// ... (fill other properties)
db.Revisions.InsertOnSubmit(rev);
db.SubmitChanges();
}
Вычисление максимума и его увеличение может привести к состоянию гонки .
Есть ли лучший способ реализовать эту функцию?