Sql server 事务的两种用法
用這個表創建一個存儲過程:
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?--執行第二個操作,接受轉賬的金額,增加
?
if @@error<>0?--判斷如果兩條語句有任何一條出現錯誤
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方法,回滾到事務操作開始之前;
??????? }
?
??? }
這就是兩個事務不同用法的簡單例子,ADO.NET?事務處理的方法看起來比較簡單,但是他要使用同一個連接來執行這些操作,要是同時使用幾個數據庫來用一個事務執行,這樣就比較繁瑣,但是要是用sql存儲過程,這樣就相對比較簡單,總之是兩種方法各有各的優點。
轉載于:https://www.cnblogs.com/litaohao/archive/2013/03/02/2939766.html
總結
以上是生活随笔為你收集整理的Sql server 事务的两种用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Equals 和 == 的区别
- 下一篇: TCP拥塞控制算法 — CUBIC的补丁