事務処理の2つの方法(お茶1ポットから)
4722 ワード
(Transaction) , 。 , , 。
,SQL Server , 。
sql server+ .net , , ;
sql , ADO.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つの方法にはそれぞれメリットがあります.