2010-04-09 2 views
7

여러 스레드에서 DataTable에 액세스한다고 가정합니다. 내가 특정 행에 액세스하려면, 나는 그 작업을 잠글 필요가 의심 (나는 이것에 대해 잘못 될 수있다, 그러나 적어도 나는 이런 식으로 나는 안전 해요 알고) : 나는 경우, 다음DataRow를 업데이트하는 경우 전체 DataTable 또는 DataRow를 잠급니다.

// this is a strongly-typed table 
OrdersRow row = null; 
lock (orderTable.Rows.SyncRoot) { 
    row = orderTable.FindByOrderId(myOrderId); 
} 

하지만를 업데이트 그 행을, 내가 테이블을 (또는 오히려, 테이블의 Rows.SyncRoot 개체) 다시 잠 그거나, 단순히 행을 잠글 수 있습니까?

답변

5

사실 실제로 DataTable 또는 DataRow의 한 곳에서 lock을 수행하는 것은 실제로는 을 수행하지 않습니다.을 수행하십시오. Monitor 잠금을 사용할 때 기억해야 할 중요한 점은 (어떤 블록이 lock인지) 객체를 잠그면 아무 것도하지 않는다는 것입니다. 그 이유 중 하나는 자원 자체를 잠그지 않고 전용 잠금 객체를 사용하는 것을지지하는 한 가지 이유입니다. 리소스를 처리 할 때마다 잠금을 수행해야한다는 것을 깨닫게되기 때문입니다. 데이터 저장 자체가합니다 (DataRow 객체가 내부적으로 만 데이터를 검색하는 곳으로 DataTable에의 오프셋 (offset) 포함) 같이 말했다되고 그건

, 그것은 전체 DataTable를 잠글 수있는 더 좋은 생각입니다. 따라서 개별 행에 대한 액세스를 동기화하더라도 두 개의 행을 동시에 업데이트하면 행이 비동기 방식으로 동일한 데이터 저장 장치를 업데이트하게됩니다.

내부 유형을 "블랙 박스"로보고 필요한 항목 만 잠그는 것 사이에는 충돌이 있습니다 (이 경우 행을 잠그는 잘못된 결론으로 ​​이어질 수 있음). 통찰력을 얻으 려합니다. 타입의 내부 동작으로 구현 세부 사항 에 의존하여을 변경할 수 있습니다.

현재 동기화되지 않은 방식으로 내부 데이터 저장소 시스템을 업데이트하지 않으려면 DataTable 전체를 잠글 것을 권장합니다..

+0

매우 통찰력있는 대답, 나는'lock' 메커니즘이 어떻게 작동 하는지를 지적해야 할 필요성을 느낀 이유를 알 수있다. 나는 잠금이 객체에 아무 것도하지 않는다는 것을 깨달았다. 내 질문에 "내가 행 단위 또는 테이블 단위로 업데이트 작업을 동기화해야합니까?"라고 말하면서 더 나은 방법이라고 생각합니다. 어쨌든이 시점에서 필자는 테이블 또는 전용 "테이블 잠금"을 잠그 든 (모든 경우에 행을 생각하면) 전체 테이블에서 * 모든 * 행에 대한 업데이트를 동기화해야한다는 것이 확실합니다. SyncRoot' 객체는 실제로 그 목적을 잘 수행합니다). –

3

읽기/쓰기 만 잠글 필요가 없습니다. 가능한 한 가장 작은 양의 데이터를 잠 그어 데이터 일관성을 유지하십시오. 일반적으로 업데이트하는 행은 하나뿐입니다. 테이블 간의 상위/하위 관계를 업데이트하는 경우 각 테이블의 각 행을 잠글 필요가 있습니다. 멀티 스레드가 작업을 읽기

+0

Kevin (http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/11b69e1a-ad6c-48d5-8e14-264af5b0692e)에서 제공하는 링크는 테이블을 잠그는 것이 필요한, 실제로. MSFT 담당자는 다음과 같이 말합니다. "단일 행을 업데이트해도 테이블에있는 다른 요소에 영향을 미치지 않는다고 가정하면 나중에 구현할 가능성이있는 구현 세부 사항에 쉽게 의존 할 수 있으므로 위험합니다." 이것이 사실인지 아닌지에 대한 통찰력이 있습니까? –

3

DataTable에는 안전 : DataTable에 대한 책을 읽은에

http://msdn.microsoft.com/en-us/library/system.data.datatable.aspx

http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/11b69e1a-ad6c-48d5-8e14-264af5b0692e

을 테이블을 잠그고 안전하게에 허용 할 수있는 능력에 관한 상충되는 정보가 데이터를 연속적으로 업데이트하십시오. 두 번째 링크에 따르면 테이블을 잠그고 행을 업데이트 할 수 있습니다. 이것은 MS MVP에서 나온 것입니다. 아마도 테이블을 잠그고 ok라고 말할 수 있습니다.

+1

링크는 다음과 같습니다 : "이 유형은 다중 스레드 읽기 작업에 안전합니다. 모든 쓰기 작업을 동기화해야합니다." 다중 스레드 액세스를 위해 잠금이 올바로 수행된다는 것을 의미하지 않습니까? – code4life

+0

나는 혼란 스럽다. 당신이 제공 한 첫 번째 링크는 쓰기 만 잠글 필요가 있다고 말하는 것 같습니다 (잠글 것을 말하지는 않지만). 두 번째는 테이블을 잠그는 것이 올바른 접근 방법임을 나타냅니다. 어느 쪽도 테이블을 잠글 수없고 읽기 일관성을 기대할 수 없다는 귀하의 진술에 동의하지 않는 것 같습니다. 내가 놓친 게 있니? –

+0

첫 문장이 잘못되었습니다. 상충되는 정보를 발견했습니다. 데이터를 읽으려면 테이블을 잠글 필요가 없습니다. 데이터를 쓰려면 테이블을 잠 가야합니다. – kemiller2002

관련 문제