То, что вы описали это стандартная concurrency control проблема. В случае веб-разработки для решения проблемы используйте обычно optimistic concurrency control. В качестве разработчика ASP.NET вы, вероятно, используете Microsoft SQL Server для хранения данных. SQL Server поддерживает очень полезный тип данных rowversion (также известный как timestamp
). Столбец с нулевым значением rowversion
семантически эквивалентен столбцу binary(8)
. Основным преимуществом использования rowversion
является простота использования. SQL Server поддерживает внутренний счетчик, связанный с базой данных. Счетчик доступен для переменной @@DBTS
. Каждый раз, когда строка из таблицы базы данных будет изменена, будет изменен столбец rowversion
автоматически на значение @@DBTS
и @@DBTS
будет увеличиваться. Можно использовать дополнительный столбец rowversion
, чтобы легко определить, изменилось ли какое-либо значение в строке с момента последнего чтения.
Итак, если у вас есть существующая таблица базы данных, вы можете просто добавить один столбец, который будет содержать rowversion (временную метку) счетчика обновления строки. Например, оператор
ALTER TABLE dbo.Users ADD RowUpdateTimeStamp rowversion NOT NULL
добавит RowUpdateTimeStamp
столбец типа rowversion
к столу dbo.Users
. Если вы создаете таблицу новых пользователей, вы можете сделать что-то вроде ниже
CREATE TABLE dbo.Users (
Id int NOT NULL IDENTITY,
FirstName nvarchar(64) NOT NULL,
LastName nvarchar(64) NOT NULL,
RowUpdateTimeStamp rowversion NOT NULL,
CONSTRAINT PK_Users PRIMARY KEY CLUSTERED (Id ASC),
CONSTRAINT UC_Users_LastName_FirstName UNIQUE NONCLUSTERED (LastName ASC, FirstName ASC)
)
Он создает таблицу, в которой вы описали, но таблица будет иметь дополнительный RowUpdateTimeStamp
столбец типа rowversion
. Важно еще раз подчеркнуть, что не нужно сохранять значение в столбце вручную. SQL Server автоматически сохранит/изменит значения столбца.
Если вы заполнили сетку данными из таблицы, вы можете, например, включить скрытый RowVersion
столбец whit значение от RowUpdateTimeStamp
столбец таблицы базы данных. Определение соответствующего столбца в colModel
выглядит
name: "RowVersion", sortable: false, hidden: true, hidedlg: true,
editable: true, editrules: { edithidden: false }
Это означает, что значение из скрытого RowVersion
будет посылать вместе со значениями других изменяемых столбцов.
Методы сервера, которые изменяют строки сетки, возвращают модифицированную версию RowUpdateTimeStamp
.Я использую aftersavefunc
обратный вызов inline editing или afterSubmit
из form editing для изменения RowVersion
столбец сетки со значением, возвращаемым с сервера.
Если сервер получает запрос на изменение от клиента, он всегда имеет RowVersion
модифицирующей строки. Код сервера проверяет, имеет ли соответствующие данные в базе данных меньшее или равное значение в столбце RowUpdateTimeStamp
. Это база данных имеет более высокое значение, то еще пользователь уже изменил данные. В случае, если сервер возвращает HTTP-ответ с некоторым кодом HTTP-ошибки (> = 300). jqGrid интерпретирует ответ как ошибку и отображает соответствующее сообщение об ошибке. Для настройки сообщения об ошибке можно использовать errorTextFormat или errorfunc.
Я использую описанный выше подход во всех продуктивных реализациях. Вы можете прочитать дополнительную информацию о предмете в the old answer.
спасибо. Еще один маленький вопрос ниже. Я буду признателен, если вы ответите. –
@Altan Alansu: Если у вас есть другой вопрос, разместите новый вопрос или отредактируйте существующий. – BoltClock