문제
가장 좋은 방법은 무엇을 트랜잭션에서는 C#.Net2.0.무엇이 있는 클래스를 사용되어야 하는가?는 함정이 무엇인지를 위해 밖을 봐 etc.모든 것을 투입하고 rollback 물건입니다.나는 그냥 시작하는 프로젝트 수 할 필요가 일부 거래를 하는 동안 데이터를 삽입하 DB.어떤 응답하거나 링크에 대한 기본적인 물건에 대한 트랜잭션을 환영합니다.
해결책
2 종류가 있의 트랜잭션연결 거래 및 주변 트랜잭션이 있습니다.에 연결 트랜잭션(예:SqlTransaction)에 직접 연결로 db 연결을(등렇게 하려면 다음과 같이)즉,당신은 유지하는 통과 연결의 주위에-에서 확인이 어떠한 경우에는,그러나 수 없도록 만들기"사용//출시"사용을 허용하지 않는 십자가는 db 작업이다.예(포맷을 위한 공간):
using (IDbTransaction tran = conn.BeginTransaction()) {
try {
// your code
tran.Commit();
} catch {
tran.Rollback();
throw;
}
}
너무 더러운,그러나 제한을 우리의 연결"conn".우리가 원하는 경우를 부르는 다른 방법을 우리는 지금 전달해야"conn"니다.
대체는 주변의 트랜잭션새로운습니다.NET2.0 TransactionScope 체(System.Transactions.dll)을 사용할 수 있는 범위에서 작업(적당한 공급자를 자동으로 참여서 주변에 트랜잭션).이것은 쉽게 복고풍에 맞는 기존하는(비-트랜잭션)코드,그리고 이야기하는 여러 공급자로더(DTC 참여하는 경우에 당신은 이야기는 하나 이상의).
예를 들어:
using(TransactionScope tran = new TransactionScope()) {
CallAMethodThatDoesSomeWork();
CallAMethodThatDoesSomeMoreWork();
tran.Complete();
}
참고 여기에는 두 가지 방법을 처리할 수 있는 자신의 연결(열어/사용/닫기/dispose),아직 그들은 자동으로 된 부분의 주위의 거래 없이 우리에게는 아무것도 전달합니다.
면 코드에 오류 처리하십시오()호출 할 것 없이 완료(),그래서 그것을 것입니다.예상 중첩 등을 지원할 수 있지만,없는 목록-다 내부 거래가 아직 완료 외부 트랜잭션:다면 사람들은 불행하고,트랜잭션이 중단되었습니다.
의 다른 장점 TransactionScope 은 그것에 묶이지 않을 데이터베이스어떤 트랜잭션을 알고 업체로 사용할 수 있습니다.WCF,예를 들어.거나 심지어 일부 TransactionScope 호환 개체형(i.e.NET 클래스로 롤백 기능이-아마 보다 쉽게 기념하지만,나는 결코 사용되는 이 방법을 자).
모두 모두,매우 매우 유용한 객체입니다.
몇 가지 유의할 사항:
- SQL Server2000,TransactionScope 갈 것이다 DTC 즉시;이에서 SQL Server2005 위를 사용할 수 있 성남 담당(훨씬 적은 오버헤드)할 때까지는 이야기 2 원 등을 때,그것은 상승하 DTC.
- 가 결함 는 의미할 수 있습을 조정할 필요 연결 문자열
다른 팁
protected void Button1_Click(object sender, EventArgs e)
{
using (SqlConnection connection1 = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\Database.mdf;Integrated Security=True;User Instance=True"))
{
connection1.Open();
// Start a local transaction.
SqlTransaction sqlTran = connection1.BeginTransaction();
// Enlist a command in the current transaction.
SqlCommand command = connection1.CreateCommand();
command.Transaction = sqlTran;
try
{
// Execute two separate commands.
command.CommandText =
"insert into [doctor](drname,drspecialization,drday) values ('a','b','c')";
command.ExecuteNonQuery();
command.CommandText =
"insert into [doctor](drname,drspecialization,drday) values ('x','y','z')";
command.ExecuteNonQuery();
// Commit the transaction.
sqlTran.Commit();
Label3.Text = "Both records were written to database.";
}
catch (Exception ex)
{
// Handle the exception if the transaction fails to commit.
Label4.Text = ex.Message;
try
{
// Attempt to roll back the transaction.
sqlTran.Rollback();
}
catch (Exception exRollback)
{
// Throws an InvalidOperationException if the connection
// is closed or the transaction has already been rolled
// back on the server.
Label5.Text = exRollback.Message;
}
}
}
}
당신은 또한 포장의 트랜잭션으로 자신의 저장된 절차 및 처리하는 방법 대신 트랜잭션에서는 C#다.
DB 관련 물건에 필요한 경우 일부 또는 맵퍼 (예 : Nhibernate)는 기본적으로 상자에서 트랜스 팩 티노를 지원합니다.
또한 필요한 것에 따라 다릅니다. 기본 SQL 트랜잭션의 경우 Code에서 시작 및 커밋 트랜스를 사용하여 TSQL 트랜잭션을 수행 할 수 있습니다. 그것은 가장 쉬운 방법이지만 복잡성이 있으며 제대로 커밋해야합니다 (및 롤백).
나는 같은 것을 사용할 것입니다
SQLTransaction trans = null;
using(trans = new SqlTransaction)
{
...
Do SQL stuff here passing my trans into my various SQL executers
...
trans.Commit // May not be quite right
}
모든 실패는 바로 당신을 튀어 나옵니다 using
그리고 거래는 항상 커밋되거나 롤백됩니다 (당신이 말하는 것에 따라). 우리가 직면 한 가장 큰 문제는 그것이 항상 헌신적인지 확인하는 것이 었습니다. 사용은 트랜잭션의 범위가 제한되어 있는지 확인합니다.