응용 프로그램에서 다른 SQL 프로 시저를 사용하고 있습니다. 첫 번째 절차에서는 C# 코드에서 일부 처리를 삽입 한 다음 두 번째 절차 을 수행 한 다음 몇 가지 코드를 다시 처리하고 세 번째 절차에서 일부 레코드를 삭제 한 다음 새 레코드를 삽입합니다. 서버 1에서 모든 작업이 완료되면이 서버에서 데이터를 가져 와서 서버 2로 전송합니다. 레코드가 삭제되고 새 레코드가 삽입됩니다. 모든 프로 시저의 모든 서버에서 오류가있는 경우 모든 레코드를 롤백하고 싶습니다. 처리가 시간이 걸리고 다른 사용자가 동일한 테이블을 동시에 사용하기 때문에 테이블을 차단할 수 없기 때문에 begin trans를 사용할 수 없습니다. 그래서 친절하게도 다른 사용자를 위해 테이블을 차단하지 않고 어떻게 달성 할 수 있는지 말해주십시오.오류가 발생하면 다른 데이터베이스 서버에서 여러 쿼리를 롤백하는 방법
미리 감사드립니다.
편집 (코드 예제 추가) : 트랜잭션 범위를 시도했지만 연결을 여는 동안 예외가 발생했습니다. MS DTC를 구성했지만 올바르게 구성되지 않았을 수 있습니다.
"분산 트랜잭션 관리를위한 네트워크 액세스 (MSDTC)가 비활성화되었습니다. MSDTC 구성 요소 서비스 관리 도구를 사용하기위한 보안 구성에서 네트워크 액세스를 위해 DTC를 사용하십시오."
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
{
try
{
dl.SetBookReadyToLive(13570, false);
//SetBookReadyToLive
dl.AddTestSubmiitedTitleID(23402);
dl.AddBookAuthorAtLIve(13570, 1);
ts.Complete();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
}
공공 무효 SetBookReadyToLive (긴 bookID로서, 부울 상태) 는 { 시도 { 경우 (dbConMeta.State = ConnectionState.Open!) dbConMeta.Open();
SqlCommand cmd = new SqlCommand("spSetBookReadyToLive", dbConMeta);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Clear();
cmd.Parameters.Add("@BookID", BookID);
cmd.Parameters.Add("@status", status);
cmd.ExecuteNonQuery();
if (dbConMeta.State == ConnectionState.Open)
dbConMeta.Close();
}
catch
{
if (dbConMeta.State == ConnectionState.Open)
dbConMeta.Close();
}
}
나는
내가 SQL 서버 2000, 난 내 PC에 또한 SQL 서버가 설치된 시스템에서 MS DTC의 구성을 설정 한 사용하고 있습니다> 방식의 연결을 여는에서 예외가 어디에서 코드를 실행하고 있는지. 그러나 여전히 같은 예외입니다.
David에게 도움을 청합니다. 위에 게시 된 원래 질문에 샘플 코드를 게시했습니다. 나는 거래 범위를 사용했다. 권한에 오류가 있습니다. 클라이언트 컴퓨터와 서버에서 MS DTC를 구성했지만 여전히 오류가 발생합니다. 위의 게시물을 다시 참조하십시오. 친절하게 도와주세요. 다시 한 번 감사드립니다.> –
거의 다 왔습니다! 그냥 귀하의 오류 메시지에 대한 비트 구글과 당신은 ms dtc를 설정하고 실행하는 방법에 대한 단계별 가이드와 페이지를 찾을 수 있습니다. 네트워크 오류가 가장 일반적이며 보안 설정에서 마지막 항목을 터치하면됩니다. 미안 해요. 난 진흙탕을 기억하지 못합니다. –