2012-05-04 2 views
3

문제를 해결하는 방법을 잘 모르겠다. 문제를 해결하기 위해 무엇을 고려해야하는지 알고 싶다.코드 내부 트랜잭션

우리는 VB.net 2.0 및 SQL 2005 응용 프로그램을 개발하고 있습니다. 사용자는받은 제품이 많은 구매를 기반으로 수신을 취소 할 수 있습니다. 그러나 취소 과정에서 "좋은 # 1 취소 하시겠습니까?"와 같은 몇 가지 질문을 사용자에게 요청합니다. 예이면 삭제하십시오. 그런 다음 "Good # 2 취소 하시겠습니까?", 아니요, 삭제하지 말고 또 다른 질문을합니다 (받은 항목이 있으면 사용자가 수동으로 처리해야 함). 그리고 결국, 모든 상품이 취소 된 경우, 우리는 접수 자체를 취소해야합니다. 그러나 언젠가 오류가 발생하거나이 과정에서 사용자에게 요청 된 일부 조건이 발생하면 처음부터 수행 한 작업을 취소하고 원래 상태로 되돌리려합니다. 그래서 나는 Transaction에 대해 생각했다.

  1. 내가 사용할 수 있습니다 Transaction for SQL이 알고 나는 그것을 사용하는 방법을 충분히 잘 알고,하지만 난 정말 사용자로이 가능성이 거래를 취소 작업을 수행해야 사용할 수 없습니다.

  2. 또한 .NET 2.X에서 TransactionScope을 기억하고 어떤 점을 달성 할 수 있는지 그리고 나는 또한 어떻게 사용하는지 잘 알고 있습니다. 문제는 TransactionScope 및 MSDTC에서 발생합니다. 분산 트랜잭션 관리자 (MSDTC)에 대한

네트워크 액세스가 비활성화되었습니다이를 사용하는 경우, 우리는 여전히 말했다 오류를 받고. 구성 요소 서비스 관리 도구를 사용하여 MSDTC의 보안 구성에서 네트워크 액세스를 위해 DTC를 사용하도록 설정하십시오.

여기에 설명 된 내용을 시도한 결과 in another stack post이며 사용자가 컴퓨터를 다시 사용할 때까지 훌륭하게 작동합니다. 사용자가 컴퓨터를 다시 시작할 때마다 가치를 되돌려 야합니다. 또한 기본값에 따라이 값을 On으로 설정 한 컴퓨터는 없습니다. 적어도 10 대의 컴퓨터 기반에서 아무 것도 활성화되지 않았습니다. 이 프로그램이 설치된 300 대의 컴퓨터와 같은 것이 있으므로 고려하지 않는 것이 좋은 것은 아닙니다.

그래서 누구나 내가 이것을 습득 할 수있는 방법에 대한 아이디어가 있습니까? 내가 사용할 수있는 코드를 통해 트랜잭션을 수행하는 다른 것이 있습니까?

참고 1 : 나는 사용자에게 조건을 물어보고 메모리에 값을 유지한다고 말하는 사람도 있습니다. 완료되면 모든 것이 잘 진행되면 삭제하십시오. 하지만 삭제할 때 오류가 발생한다면 상품 # 4라고할까요? 그리고 삭제 될 상품의 동적 목록을 저장 프로 시저에 제공하려면 어떻게해야합니까?

참고 2 : 영어로 불편을 드려 죄송합니다.

참고 3 : C#의 모든 예제는 VB와 C#을 모두 알고 있기 때문에 제공 될 수 있습니다. 사용자가 '하세요 Oui'를 선택하면

create proc CancelGood (@goodID int) 
as 
    SET NOCOUNT ON 
    SET XACT_ABORT ON 

    begin transaction 

    update table1 set canceled = 1 
    where GoodID = @GoodID 

    update table2 set on_stock = on_stock + 1 
    where GoodID = @GoodID 

    commit transaction 

VB 코드가 일부 canceledGoods 목록에 문자열을 추가합니다

+0

, embedd 트랜잭션과 롤백으로 삭제는 오류가 발생하는 경우. 배치 내의 자동 롤백에 대한 자세한 내용은 [SET XACT_ABORT ON] (http://msdn.microsoft.com/en-us/library/ms188792%28v=sql.90%29.aspx)을 참조하십시오. –

+0

그래,하지만 여전히 문제 # 1, 3, 4, 5, 8을 리셉션에서 취소 할 수 있습니다. #A. 동적 배열을 저장 프로 시저에 전달하려면 어떻게해야합니까? 방법이 있습니까? –

+0

SQL 서버에는 XML 데이터 유형이 있으므로 모든 종류의 것을 XML 매개 변수로 전달할 수 있습니다. 하지만 당신이 SQL 문을 직접 사용자 작업 및이 ExecuteNonQuery에 대한 응답으로 빌드 할 수 있다고 생각했습니다. –

답변

1

이미 취소를 관리 할 수있는 유사한 저장 프로 시저를 가정. 나는 VB에 익숙하지 않다.그물; C#에서이 보일 것 같은 :

canceledGoods.Add (string.Format("exec dbo.CancelGood {0}", goodID)); 

보다, canceledGoods 적어도 하나의 문자열, 구축 및 배치 실행이있는 경우 : 당신은 주 1 말하는 않으면

batch = "BEGIN TRANSACTION" + 
     " BEGIN TRY " + 
     string.Join (Environment.NewLine, canceledGoods.ToArray()) + 
     " END TRY" + 
     " BEGIN CATCH " + 
     " -- CODE TO CALL IF THERE WAS AN ERROR" + 
     " ROLLBACK TRANSACTION" + 
     " RETURN" + 
     " END CATCH" + 
     " -- CODE TO CALL AFTER SUCCESSFULL CANCELATION OF ALL GOODS" + 
     " COMMIT TRANSACTION" 

conn.ExecuteNonQuery (batch); 
+0

C#에서는 괜찮습니다.이 프로젝트를 시작하기 전에 C# 만 사용 했으므로 두 가지 모두에 익숙합니다. 나는 당신이 쓴 것을 시도하고 나중에 다시 돌아올 것입니다. 하지만, 내 문제의 작은 부분에 대해서만 설명 했으므로 내 측면에는 확실한 많은 일자리가 있습니다. 나는이 방법을 사용하여 이것을 어떻게 수행하는지 다시 생각해보아야한다. 아마 SQL에 비해 .NET 코드에 익숙하기 때문에 두 번째 부분을 더 easly 사용하게 될 것입니다. –

관련 문제