事務処理の2つの方法(お茶1ポットから)

4722 ワード

Transaction)        ,            。        ,     ,            。
SQL Server                ,             。
 sql server+ .net      ,              ,           ;
     sqlADO.NET
                             
      sql
create database aaaa --
go
use aaaa
create table bb
(
 ID int not null primary key,  --  
 moneys money    --    
insert into bb values ('1','2000') --      
insert into bb values ('2','3000')

このテーブルを使用してストレージ・プロシージャを作成します.
create procedure mon--ストレージ・プロシージャを作成し、いくつかの変数を定義します.
@toID int,--振込を受けた口座
@fromID int,--自分のアカウントを転出
@momeys money--振込金額
as
begin tran--トランザクションの実行を開始
 
update bb set moneys=moneys-@momeys where ID=@fromID-が実行する最初の操作は、送金してお金を引き出し、転送した金額を減算します.
update bb set moneys=moneys+@momeys where ID=@toID--2番目の操作を実行し、振替を受ける金額を増やします.
 
if@@error<>0--2つの文のいずれかにエラーが発生した場合の判断
begin rollback tran–トランザクションのロールバックを開始し、リカバリされた振り込みが開始される前のステータス
return 0
end
go
 
Else--どちらも成功しました
begin commit tranこのトランザクションの操作を実行
return 1
end
go
 
次にC#を見てみましょう.Netはこのストレージ・プロシージャをどのように呼び出しますか.
    protected void Button1_Click(object sender, EventArgs e)
    {
        SqlConnection con =new SqlConnection(@"Data Source=.\SQLEXPRESS;database=aaaa;uid=sa;pwd=jcx");//接続文字列
        SqlCommand cmd = new SqlCommand("mon",con);//ストアド・プロシージャの呼び出し
        cmd.CommandType = CommandType.StoredProcedure;
        con.Open();
        SqlParameter prar = new SqlParameter();//伝達パラメータ
        cmd.Parameters.AddWithValue("@fromID", 1);
        cmd.Parameters.AddWithValue("@toID", 2);
        cmd.Parameters.AddWithValue("@momeys",Convert.ToInt32( TextBox1.Text) );
 
        cmd.Parameters.Add("@return", "").Direction = ParameterDirection.ReturnValue;//ストアド・プロシージャの戻り値の取得
        cmd.ExecuteNonQuery();
        string value = cmd.Parameters["@return"].Value.ToString();//戻り値をvalueに割り当てる
        if (value == "1")
        {
            Label1.Text=「追加成功」
        }
        else
        {
            Label1.Text=「追加に失敗しました」;
       }
}
つまり、ストレージ・プロシージャにトランザクションを追加し、データベースにsqlストレージ・プロシージャを書かない、ADOを見てみましょう.NETはどのようにトランザクションを処理しますか:
protected void Button2_Click(object sender, EventArgs e)
    {
        SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;database=aaaa;uid=sa;pwd=jcx");
        con.Open();
        SqlTransaction tran = con.BeginTransaction();//まず、SqlTransactionクラスをインスタンス化し、このトランザクションを使用してconという接続を使用し、BeginTransactionというメソッドを使用してトランザクションの実行を開始します.
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = con;
        cmd.Transaction = tran;
        try
        {
//try{}ブロックでsqlcommandコマンドを実行し、
            cmd.CommandText = "update bb set moneys=moneys-'"+ Convert.ToInt32(TextBox1.Text) + "' where ID='1'";
            cmd.ExecuteNonQuery();
            cmd.CommandText = "update bb set moneys=moneys+' aa ' where ID='2'";
            cmd.ExecuteNonQuery();
            tran.Commit();//両方のsqlコマンドが正常に実行された場合、commitという方法を実行し、これらの操作を実行します.
 
            Label1.Text=「追加成功」
        }
        catch
        {
            Label1.Text=「追加に失敗しました」;
            tran.Rollback();//どのように実行が成功せず、異常が発生した場合、rollbackメソッドを実行し、トランザクション操作が開始される前にロールバックします.
        }
 
    }
これが2つのトランザクションの異なる使い方の簡単な例です.ADO.NETトランザクションの処理方法は簡単そうに見えますが、同じ接続を使用してこれらの操作を実行し、複数のデータベースを同時に使用して1つのトランザクションを実行すると煩雑になりますが、sqlストレージプロセスを使用すると比較的簡単で、つまり2つの方法にはそれぞれメリットがあります.