2014-12-05 8 views
0

여러 사용자가 엔티티에 대한 정보를 편집 할 수있는 데이터베이스를 사용하여 응용 프로그램을 만들려고합니다.사용자가 데이터를 입력하는 동안 SQL 행 잠금 C#

tldr : 사용자가 C#에서 정보를 편집하는 동안 데이터베이스의 행을 잠그는 방법.

쿼리가 실행되는 동안 데이터베이스에서 레코드 잠그기에 대한 조사를했습니다. 내가 주로 보는 부분은 begin transactioncommit transaction입니다. 그러나 이것은 쿼리가 실행되는 시간보다 오래 잠겨 야하기 때문에 내 필요에 맞지 않습니다.

user1이 (양식 응용 프로그램에서 텍스트 상자를 채우는 C#으로) 레코드를 편집하는 경우 편집이 끝날 때까지 해당 행이 잠겨 있어야합니다. 동시에 user2는 동일한 레코드를 편집하려고 할 수 있습니다. user1이 완료되면 모든 것이 정상이지만 user2가 끝나면 ether는 더 이상 존재하지 않는 레코드 (이름)에 대해 다시 덮어 쓰거나 오류를 반환합니다.

간단한 해결책은 사용자가 행을 편집 할 수 있는지에 따라 IsLocked 열을 추가하는 것입니다. 그러나 어떤 이유로 응용 프로그램이 충돌하거나 사용자가 작업 관리자에서 프로세스를 중지하면 행이 영원히 잠 깁니다. (또는이 문제가 발생하는 동안 여전히 코드를 실행할 수있는 방법이 있습니까?)

또 다른 방법은 commit transaction없이 쿼리를 실행하는 것입니다. 이를 위해서는 연결을 열어 두어야한다고 생각합니다. 그렇지 않으면 연결이 끊어집니다. 개방형 연결을 유지하는 것은 응용 프로그램을 실행하는 동안 나에게 좋은 생각이 아닌 것 같은가요?

사이드 노트 : 제목에서 (my) sql은 내가 어느 것을 사용할 지 잘 모르니까요.

시간 동안 Thx!

답변

1

사용자가 일종의 GUI 형식으로 데이터를 편집하는 동안 행을 잠그는 것이 가장 좋은 해결책이라고 생각하지 않습니다. 응용 프로그램이 충돌 할 수 있습니다 또는 사용자가 오랜 시간 동안 행 편집 할 수 있습니다 ...이 deffinitely 당신이 몇 가지 고유 한 ID가 있어야합니다 (MS SQL, MySQL을 ...)

  • 기록을 사용하게 될 SQL 엔진에 의존하지 않는다. 따라서 UPDATE table SET ..... WHERE entityID = someID과 같은 쿼리는 이전 값에 종속되지 않습니다 (가능한 행 삭제에만 유의하십시오)

  • 편집하기 전에 값을 기억하고 (데이터베이스 레코드의 일부 타임 스탬프) 행을 업데이트하기 전에이를 확인할 수 있습니다. 누군가가 동일한 기록을 변경했음을 알게되고 사용자에게 알릴 수 있습니다. "열린 연결을 유지"에 관한

- DBConnection이는 IDisposable을 구현은, 그것을 사용하는 방법 this 게시물을 읽을. 다시 연결을 인식 할 필요가 없습니다 - SQL Connection Pooling에 대해 읽어보십시오.