문제

데이터 저장에 XML을 사용하는 오래된 시스템이 있습니다. 다른 미니 프로젝트에 대한 데이터를 사용하고 데이터를 쿼리/업데이트하기 위해 LINQ에서 XML을 사용하고 싶었습니다. 그러나 내가 자신을 다룰 필요가 있는지 확실하지 않은 두 가지 시나리오가 있습니다.

1- 다음 코드와 비슷한 것이 있고 2 명이 Save ()를 동시에 누르면? LINQ에서 XML을 저장하기 전에 파일을 다시 사용할 수있을 때까지 기다리나요? 아니면 그냥 던질까요? 필요하지 않으면 자물쇠를 넣고 싶지 않습니다. :)

// I assume the next line doesn't lock the file
XElement doc = XElement.Load("Books.xml");
XElement newBook = new XElement("Book",
new XAttribute("publisher", "My Publisher"),
new XElement("author", "Me")));
doc.Add(newBook);

// What happens if two people try this at the same time?
doc.Save("Books.xml");

2- 문서를로드하면 특정 노드 아래에 항목을 추가 한 다음 Save ()를 누르십시오. 다른 사용자가 이미 해당 노드 아래에서 값을 추가 한 경우 (내로드를 누르기 때문에) 노드를 삭제 한 경우 어떻게됩니까?

분명히 나는이 문제들을 해결할 수 있지만, 내가 해야할지 여부를 알려줄 수있는 문서를 찾을 수 없었으며, 첫 번째는 적어도 안정적으로 테스트하기 위해 약간의 돼지 일 것입니다.

도움이 되었습니까?

해결책

실제로 LINQ에서 XML 문제가 아니라 기본 동시성 문제입니다.

  1. 두 사람이 동시에 저장을 받고 있다고 가정하고 백업 스토어가 파일이라고 가정 한 다음 저장을 위해 파일을 열는지에 따라 오류가 발생할 수 있습니다. XDocument 클래스 (파일 이름을 전달함으로써)에 맡기면 독점적으로 열 수 있으며 다른 사람이 동일하게 수행하려는 다른 사람 (동일한 코드를 치는 것으로 가정)은 예외가됩니다. 기본적으로 읽고있는 공유 리소스에 대한 액세스를 동기화해야합니다.

  2. 다른 사용자가 이미 값을 추가 한 경우 작성할 리소스를 얻는 데 문제가 없다고 가정하면 변경 사항이 리소스를 덮어 씁니다. 이것은 낙관적 동시성으로 알려진 데이터베이스의 빈번한 문제이며, 데이터를로드 한 시간 사이에 변경이 발생했는지 여부와 저장시 (대부분의 데이터베이스가 타임 스탬프 값을 생성 함)를 나타 내기 위해 일종의 값이 필요합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top