SQL 질문과 답변 게시판
DB에 만약 1000개의 레코드가 있으면
A,B,C PC에서 100개씩 읽어오도록 하려고 합니다.
A PC에서
sql = String("select top(100) * from tb01 where v1 = 'R'");
q->Close();
q->SQL->Clear();
q->SQL->Text = sql;
q->Open();
while(!q->Eof)
{
if(n >= max) break;
inc = q->FieldByName("inc")->AsInteger;
ListBox1->Items->Add(IntToStr(inc) + String(" Read"));
q->Edit();
q->FieldByName("v1")->AsString = "I";
q->Post();
/*
MSSQL->SQL->Clear();
MSSQL->SQL->Text = String("update tb01 set v1 = 'I', v2 = getdate()")+\
String("where inc = ")+IntToStr(inc);
MSSQL->Execute();
*/
n++;
q->Next();
}
q->Close();
이런식으로 읽어와서 v1 필드에 값을 써 넣어 다른 PC에서 읽지 않돌고 하려고 했으나
A에서 읽어서 쓰는 중간에 B,C에서 sql을 똑같이 실행하면
중첩되서 데이타를 가져오게 됩니다.
이것을 중첩되지 않게 A,B,C 에서 가져가게 하려면 어떻게 해야 하나요.


SELECT와 UPDATE가 분리되어서 문제가 발생하는것 같습니다.
CREATE TABLE OUTPUT_TEST
(
COL1 INT
, COL2 CHAR(1)
, COL3 INT
);
INSERT INTO dbo.OUTPUT_TEST(COL1, COL2, COL3)
VALUES (1, 'R', 1), (2, 'R', 20), (3, 'L', 30);
UPDATE TOP (100) dbo.OUTPUT_TEST
SET COL2 = 'L'
OUTPUT INSERTED.COL1, INSERTED.COL2, INSERTED.COL3
WHERE COL2 = 'R'
위와 같이 하시면은 UDATE한 결과를 가저올 수 있습니다. UPDATE가 다른 트랜잭션(SELECT, UPDATE)를 막아주기 때문에 중복되 행을 가저오는 것을 막을 수 있을 것입니다. 단 WITH (NOLOCK)힌트를 사용한 SELECT는 막을 수 없습니다.
http://msdn.microsoft.com/en-us/library/ms177564.aspx 를 참고해 보시고요.
SQL SERVER OUTPUT으로 검색해 보시면 참고 자료가 많습니다.