使用事務一般是進行數據寫入,數據讀取一般是不需要這貨的
第一種辦法:
使用存儲過程:
顧名思義,在存儲過程中定義好變量,定義好事務開始,結束,錯誤回滾然後在ADO.NET中正常調用存儲過程的方法就行
/// <summary>
/// 通過存儲過程來使用事務
/// </summary>
/// <param name="conn">數據庫鏈接</param>
/// <param name="id">傳入的參數</param>
private void TransactionDB(SqlConnection conn, int id)
{
SqlCommand cmd = new SqlCommand("spAddOrderxxxx", conn);//第一個參數為存儲過程名
cmd.CommandType = CommandType.StoredProcedure;//設置命令方式為存儲過程
cmd.Parameters.Add("@CustomerID", SqlDbType.Int).Value = id;//設置參數
try
{
conn.Open();
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
Trace.Write(ex.Message);
}
finally
{
if (conn.State != ConnectionState.Closed)
{
conn.Close();
}
}
}
而事務提現在存儲過程中
CREATE PROcedure [spAddxxxx]
@CustomerID int
AS
Begin Transaction
..........此處省略若干行
commit transaction
return
ErroHandler:
rollback transaction
return
第二種方式:采用ADO.NET帶有的事務處理方式(能對付不支持事務的數據庫哦)
private void Transaction(SqlConnection conn)
{
SqlCommand cmd = new SqlCommand("xxxxx", conn);//xxxxx為SQL語句
SqlTransaction transaction = null;
try
{
conn.Open();
transaction = conn.BeginTransaction();
cmd.Transaction = transaction;//命令綁定事務
cmd.ExecuteNonQuery();
cmd.CommandText = "xxxxxxxxxxyyyyy";//換個命令再來!
cmd.ExecuteNonQuery();
transaction.Commit();//OK,現在才開始執行哦
}
catch (Exception ex)
{
transaction.Rollback();//異常回滾
}
finally
{
if (conn.State != ConnectionState.Closed)
{
conn.Close();
}
}
}
結束,這就是使用事務的兩種方法。在進行大量數據寫入的情況下很適合用事務哦,具體原理~去翻SQL書吧。