블로그 이미지
Magic_kit
study 관련자료를 한곳으로 자기 개발 목적으로 재태크 재무 관리 목적으로 일상생활의 팁을 공유 하기 위하여 블로그를 개설 하였습니다.

calendar

1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28

Category

Recent Post

Recent Comment

Archive

2009. 9. 28. 12:19 .Net Project/ADO.NET 3.5
반응형
트랜잭션 시작
API 함수와 Transact-SQL 문을 사용하여 SQL Server 데이터베이스 엔진
인스턴스에서 명시적, 자동 커밋 또는 암시적 트랜잭션을 시작할 수 있습니다.
명시적 트랜잭션
API 함수를 사용하거나 Transact-SQL BEGIN TRANSACTION 문을 실행하여 트랜잭션을 명시적으로 시작합니다.

자동 커밋 트랜잭션
데이터베이스 엔진의 기본 모드입니다. 각 Transact-SQL 문은 완료 시 커밋됩니다. 트랜잭션 제어를 위한 문을 지정하지 않아도 됩니다.

암시적 트랜잭션
API 함수나 Transact-SQL SET IMPLICIT_TRANSACTIONS ON 문을 통해
암시적 트랜잭션 모드를 설정합니다. 다음 문은 자동으로 새 트랜잭션을 시작합니다. 이 트랜잭션이 완료되면 다음 Transact-SQL 문이 새 트랜잭션을 시작합니다.
일괄 처리 범위의 트랜잭션

트랜잭션 모드는 연결 수준에서 관리됩니다. 한 연결에서 트랜잭션 모드가
변경되어도 다른 연결의 트랜잭션 모드에는 영향을 주지 않습니다.



COMMIT 또는 ROLLBACK 문을 사용하거나 API 함수를 통해 트랜잭션을 종료

COMMIT
트랜잭션이 성공하면 커밋합니다. COMMIT 문을 사용하면 모든 트랜잭션 수정이 영구적으로 데이터베이스의 일부로 적용됩니다. COMMIT은 또한 트랜잭션에
사용된 잠금과 같은 리소스를 해제합니다.

ROLLBACK
트랜잭션에서 오류가 발생하거나 사용자가 트랜잭션을 취소하려고 결정한 경우
트랜잭션을 롤백합니다. ROLLBACK 문은 데이터를 트랜잭션이 시작되기 전 상태로 되돌려서 트랜잭션 진행 중 수정된 모든 내용을 취소합니다.
ROLLBACK은 또한 트랜잭션에서 보유 중인 리소스를 해제합니다.

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;
using System.Transactions; (참조추가 통해서 추가)

public partial class Category_FrmTransaction : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void btnUpdateDelete_Click(object sender, EventArgs e)
    {
       //수정과 삭제를 동시에 하기 위해서  
        string UpdateQuery =
            "Update Categories Set CategoryName =
                                      '컴퓨터' Where CategoryID = 10";
        string DeleteQuery =
            "Delete Categories Where CategoryID >= 16";

        using (SqlConnection con = new SqlConnection
                                 (ConfigurationManager.ConnectionStrings
                                 ["ConnectionString"].ConnectionString))
        {
            con.Open();

            //[1] sqlTransaction클래스의 인스턴스 생성
            SqlTransaction tran = con.BeginTransaction(""); //트랜잭션 초기화

            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;

            //[2] 현재 명령어에서 사용한 트랜잭션 지정
            cmd.Transaction = tran;
            try
            {
                cmd.CommandText = UpdateQuery;
                cmd.ExecuteNonQuery(); //수정

                cmd.CommandText = DeleteQuery;
                cmd.ExecuteNonQuery(); //삭제
                tran.Commit(); //에러가 발생하지 않으면 실행
                lblError.Text = "정상처리";
            }
            catch (Exception ex)
            {
                lblError.Text = ex.Message; //에러가 메시지 출력 
                //에러가 발생하면 롤백
                tran.Rollback();
            }
            
        }
    }
    //삭제 + 삭제
    protected void btnCommand_Click(object sender, EventArgs e)
    {
       
        string UpdateQuery =
            "Delete Categories Where CategoryID = 8";
        string DeleteQuery =
            "Delete Categories Where CategoryID2 = 9";

        //참조추가 -> .NET - > System.Transactions 추가
        using (TransactionScope scope = new TransactionScope())
        {
            using (SqlConnection con = new SqlConnection
                     (ConfigurationManager.ConnectionStrings 
                     ["ConnectionString"].ConnectionString))
            {
                con.Open();
               
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = con;
                              
                try{
                    cmd.CommandText = UpdateQuery;
                    cmd.ExecuteNonQuery(); //수정

                    cmd.CommandText = DeleteQuery;
                    cmd.ExecuteNonQuery(); //삭제

                    lblError.Text = "정상처리";
                }
                catch (Exception ex) {
                    lblError.Text = ex.Message; //에러가 메시지 출력 
                }
                //scope.Complete(); //완료
            }            
        }
    }
}


반응형
posted by Magic_kit