2010-05-18 2 views
7

나는 비슷한 질문이 how to check if you are in a transaction에있다. 확인하는 대신 중첩 된 트랜잭션을 허용하려면 어떻게해야합니까?ADO.NET 및 SQL Server에서 중첩 트랜잭션을 활성화하려면 어떻게합니까?

Microsoft SQL Server 데이터베이스에 ADO.NET을 사용하고 있습니다. T-SQL을 사용한 예제와 begin을 사용하여 트랜잭션을 시작하고 트랜잭션 이름을 사용하는 예제를 보았습니다. connection.BeginTransaction를 호출 할 때, 나는 동일한 연결에서 다른 함수를 호출, 그것은 나에게 예외주는 다시 들어 BeginTransaction을 호출

SqlConnection does not support parallel transactions. 

많은 마이크로 소프트의 변형이 허용 나타납니다,하지만 난 방법을 알아낼 수 없습니다 내 .mdf 파일로 처리하십시오.

C# 및 ADO.NET을 사용하여 Microsoft SQL Server 데이터베이스와 중첩 트랜잭션을 어떻게 허용합니까?

답변

7

전체적으로 SQL Server는 중첩 트랜잭션을 지원하지 않습니다. T-SQL에서는 BEGIN TRAN 이전에 BEGIN TRAN을 사용할 수 있지만 이는 편의를위한 것일뿐입니다. 중요한 외부 트랜잭션 일뿐입니다. SQL Server 용 .NET 클라이언트 (SqlConnection)는 그렇게 할 수 없으며 시도 할 때이 예외를 throw합니다.

+0

제 호스트가 'Microsoft SQL 2008'을 제공한다고 말합니다. 이 T-SQL이 맞습니까? T-SQL은 어디에서 왔습니까? 나는 단지 외부 트랜잭션을 계산하기를 원합니다. 'Microsoft SQL 2008'에서 허용되지 않습니까? (예외를 발생시키지 않도록 구성해야 할 수도 있습니다.) –

+0

T-SQL은 모든 버전의 SQL Server에서 실행되는 Microsoft의 SQL 표준 변형입니다. 이 예외를 피하려면 이전 트랜잭션을 커밋하거나 롤백하기 전에'BeginTransaction'을 호출하지 마십시오. 이전 트랜잭션이 여전히 보류중인 경우 트랜잭션이 될 수 없습니다. TransactionScope (http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope(VS.80).aspx)를 직접 사용해 보시길 권장합니다. –

+0

흠, 그건 같은 것이 아닙니다. 이 코드는 sqlite와 함께 사용되었으며,이 코드가 지원되는지 확신 할 수 없습니다 (ADN.net을 모두 지원하는 것으로 보일 수 있습니다). 그러나 T-SQL이 모든 버전의 SQL Server에 있다면 나는 이상하게 들릴 것입니다. 그렇다면 이것을 허용해서는 안됩니다. 그 하나의 기능은 내 인생을 더 쉽게 만들 것입니다. 비록 그것을 사용하는 단 하나의 함수 (내가 단 하나의 연결이 완료 될 때까지 사용되는 init에서만 그것을 파괴 할 수 있다고 생각합니다.) –

1
SqlConnection conn = new SqlConnection(@"Data Source=test;Initial Catalog=test;User ID=usr;Password=pass"); 
conn.Open(); 
var com = conn.CreateCommand(); 

com.CommandText = "BEGIN TRANSACTION"; 
com.ExecuteNonQuery(); 
com.CommandText = "BEGIN TRANSACTION"; 
com.ExecuteNonQuery(); 
com.CommandText = "INSERT INTO testTable (ParamName,ParamValue) values ('test','test');"; 
com.ExecuteNonQuery(); 
com.CommandText = "COMMIT TRANSACTION"; 
com.ExecuteNonQuery(); 
com.CommandText = "ROlLBACK TRANSACTION"; 
com.ExecuteNonQuery(); 

com.CommandText = "SELECT COUNT(*) FROM testTable "; 

MessageBox.Show(string.Format("Found {0} rows.", com.ExecuteScalar())); 
+0

이 답변은 당신이 그것을 실행하여 발견 한 것에 대한 몇 가지 코멘트로부터 이점을 얻을 수 있습니다. – jocull

3

SQL Server에서 중첩 트랜잭션을 지원하는 것은 일반적인 오해입니다. 그렇지 않습니다. 여러 트랜잭션을 열고 커밋을 호출하면 절대 아무 것도하지 않습니다. 당신은 쉽게 자신을 시도하는 몇 가지 테스트 SQL을 작성할 수 있습니다. 중첩 된 트랜잭션을 에뮬레이션하는 유일한 옵션은 Savepoints를 사용하는 것입니다.

중요한 것은 @@ TRAN_COUNT가 0에 도달 할 때 외부 트랜잭션 만 커밋되는 지점입니다.

관련 문제