2013-03-10 3 views
2

Jqgrid 행 업데이트에 대한 질문이 있습니다. 우리는 아래와 같은 데이터베이스 테이블을 가지고 있습니다.jqGrid 행 업데이트

ID : 1 필드 1 : 존 FIELD2 :

검은 사용자가 ID = 1라는 이름의 필드가 첫 번째 행을 업데이트하려고합니다 상상해보십시오. 사용자가 행을 두 번 클릭하고 행의 세부 정보를 엽니 다. 보시다시피 첫 번째 행 인 field1은 john이고 field2는 검은 색입니다. 다른 사용자가 첫 번째 사용자 이후에 동일한 행을 두 번 클릭하고 field2를 빨간색으로 업데이트하면 어떻게됩니까? 첫 번째 사용자는 여전히 업데이트 화면에 있습니다. 그의 화면에서 field2는 여전히 검은 색입니다. 그런 다음 첫 번째 사용자는 field1을 잭으로 만 업데이트하고 행을 저장합니다. 결과는 field1 : jack, field2 : black이됩니다. 첫 번째 사용자는 field2의 변경을 알지 못했기 때문에. 그리고 두 번째 사용자의 field2 변경이 사라졌습니다. 이 예에서 데이터 손실을 방지하려면 어떻게해야합니까? 사용자를 두 번 클릭하고 행의 변경 사항을 저장할 때

어떻게 당신이 설명하는 표준 concurrency control 문제입니다 .. 사전

답변

2

에서 감사합니다 모든 필드를 업데이트합니다. 웹 개발의 경우에는 일반적으로 optimistic concurrency control을 사용하여 문제를 해결하십시오. ASP.NET 개발자는 Microsoft SQL Server를 사용하여 데이터를 보관할 수 있습니다. SQL Server는 매우 유용한 데이터 형식 인 rowversion (timestamp 데이터 형식이라고도 함)을 지원합니다. Null이 허용되지 않는 rowversion 열은 의미 상으로 binary(8) 열과 같습니다. rowversion의 주요 이점은 사용법이 간단하다는 것입니다. SQL Server는 데이터베이스와 연결된 내부 카운터를 지원합니다. 카운터는 @@DBTS 변수마다 액세스 할 수 있습니다. 데이터베이스의 테이블에서 행이 수정 될 때마다 rowversion 열이 으로 자동 변경되고@@DBTS으로, @@DBTS은 증가합니다. 추가 rowversion 열을 사용하여 행의 값이 마지막으로 읽은 이후로 변경되었는지 여부를 쉽게 판별 할 수 있습니다.

기존 데이터베이스 테이블이 있으면 행 업데이트 카운터의 rowversion (타임 스탬프)을 보유 할 열을 하나만 추가하면됩니다. 예를 들어, 문

ALTER TABLE dbo.Users ADD RowUpdateTimeStamp rowversion NOT NULL 

테이블 dbo.Users에 유형 rowversionRowUpdateTimeStamp 열을 추가합니다. 새로운 사용자 테이블을 작성하는 경우 당신은 그것은 당신이 설명하는 테이블을 생성

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) 
) 

아래처럼 뭔가를 할 수 있지만, 테이블은 유형 rowversion의 추가 RowUpdateTimeStamp 열이있을 것이다. 열에 수동으로 값을 저장할 필요가 없다는 점을 강조하는 것이 중요합니다. SQL Server는 자동으로 열 값을 저장/수정합니다.

표의 데이터로 표를 채우는 경우 예를 들어 숨겨진 RowVersion 열을 데이터베이스 테이블의 RowUpdateTimeStamp 열의 값으로 채울 수 있습니다. 숨겨 RowVersion의 값이 다른 가능한 항목의 값과 함께 발송되는 것을 의미

name: "RowVersion", sortable: false, hidden: true, hidedlg: true, 
editable: true, editrules: { edithidden: false } 

같이 colModel의 해당 칼럼의 정의 보인다.

그리드 행을 수정하는 서버 메소드는 RowUpdateTimeStamp의 수정 된 버전을 반환합니다.나는 aftersavefunc 콜백을 사용하여 inline editing 또는 afterSubmitform editing이고 그리드의 RowVersion 열을 서버에서 반환 된 값으로 수정하는 데 사용합니다.

서버가 클라이언트로부터 수정 요청을받는 경우 수정 행은 항상 RowVersion입니다. 서버 코드는 데이터베이스의 해당 데이터가 RowUpdateTimeStamp 열에있는 값보다 작거나 같은지 여부를 확인합니다. 데이터베이스가 더 높은 값을 갖는 경우 사용자가 이미 데이터를 수정했습니다. 이 경우 서버는 일부 오류 HTTP 코드 (> = 300)로 HTTP 응답을 반환합니다. jqGrid는 응답을 오류로 해석하고 해당 오류 메시지를 표시합니다. errorTextFormat 또는 errorfunc을 사용하여 오류 메시지를 사용자 정의 할 수 있습니다.

모든 생산적인 구현에서 위에서 설명한 방법을 사용합니다. 주제에 대한 추가 정보는 the old answer에서 읽을 수 있습니다.

+0

대단히 감사합니다. 아래의 또 다른 작은 질문. 네가 대답한다면 나는 감사 할 것이다. –

+0

@Altan Alansu : 다른 질문이있는 경우 새로운 질문을 게시하거나 기존 질문을 수정하십시오. – BoltClock