天天看點

一般的ADO.net 事務

/// 一般的ADO.net 事務

/// </summary>

public void ADONetTran1()

{

SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");

SqlCommand cmd = new SqlCommand();

try {

cmd.CommandText = "Update Region Set [email protected] where [email protected]";

cmd.CommandType = CommandType.Text;

cmd.Connection = conn; conn.Open();

SqlParameter[] paras = new SqlParameter[]{

new SqlParameter ("@UpdateID",SqlDbType.Int,32),

new SqlParameter ("@UpdateValue",SqlDbType .NChar,50)};

paras[0].Value = "2";

paras[1].Value = "Update Value12";

foreach (SqlParameter para in paras) {

cmd.Parameters.Add(para); } //開始事務

cmd.Transaction = conn.BeginTransaction();

cmd.ExecuteNonQuery();

cmd.CommandText = "insert into Region values(@InsertID,@InsertValue)";

cmd.CommandType = CommandType.Text;

paras = new SqlParameter[]{

new SqlParameter ("@InsertID",SqlDbType.Int ,32),

new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};

paras[0].Value = "7";

paras[1].Value = "Insert Value";

cmd.Parameters.Clear();

foreach (SqlParameter para in paras) {

cmd.Parameters.Add(para); }

cmd.ExecuteNonQuery(); //送出事務

cmd.Transaction.Commit();

} catch {

//復原事務

cmd.Transaction.Rollback();

throw;

}

finally {

conn.Close();

}

}

ADO.NET事務處理

事務處理需要一個資料庫連接配接以及一個事務處理對象。在SQL Server和ADO.NET中使用事務處理的難點在于SqlTransaction類。此類名稱随所使用的資料庫平台的不同而會有一些變化。例如,對于OLEDB資料庫來說,事務處理類名為OleDbTransaction。

System.Data.SqlClient namespace包括了SqlTransaction類。此類包括了兩個屬性:

Connection:訓示同僚務處理相關聯的SqlConnection對象;

IsolationLevel:定義事務處理的IsolationLevel。

屬性IsolationLevel是包括如下成員的枚舉對象:

Chaos:從高度獨立的事務進行中出現的pending changes不能被覆寫;

ReadCommitted:當資料需要被非惡意讀取時,采用共享鎖定(shared locks),但資料仍然可以在事務處理結束時被更新,這造成了非重複性的資料讀取(nonrepeatable reads)或phantom data的産生;

ReadUncommitted:惡意讀取資料是可能發生的,這表示沒有使用共享鎖定(shared locks),并且沒有實作獨占鎖定(exclusive locks);

RepeatableRead:鎖定查詢中所用到的所有資料,由此避免其他使用者對資料進行更新。在phantom rows仍然可用的狀态下,這可以避免非重複性的資料讀取(nonrepeatable reads);

Serialisable:在DataSet中進行範圍鎖定,由此防止其他使用者在事務處理結束之前更新資料或在資料庫中插入行;

IsolationLevel定義鎖定記錄的級别,但這一概念不在本文論述範圍之内。對象SqlTransaction也提供了類似的方法。你可以使用以下方法來進行事務處理:

Commit:送出資料庫事務處理;

Rollback:從未決狀态(pending state)反轉(roll back)事務處理。事務處理一旦被送出後即不能執行此操作;

Save:在事務進行中建立savepoint可以對事務處理的一部分進行反轉,并且指定savepoint名稱。

以下的C#示例将這些部分綜合起來。

這一簡單的控制台程式将通過以下步驟将兩行插入到Northwind資料庫的表格中:

調用Connection對象的BeginTransaction方法以标記事務處理的起始位置。BeginTransaction方法對事務處理傳回了一個坐标(reference),此坐标被指定給事務處理所用到的Command對象。

将Transaction對象指定給将要執行的Command的Transaction屬性。如果某Command在活動Transaction中的Connection上被執行,并且Transaction對象還沒有被指定到Command的Transaction屬性,則會産生一個異常。

調用Transaction對象的Commit方法來結束事務處理,或者調用Rollback方法來取消事務處理。

等價的VB.NET代碼與之類似。

事務處理結束

盡管這是一個簡單的示例,但它還是充分顯示了在.NET應用程式中使用事務處理是多麼的簡單。請記住,事務處理隻有在處理一組指令時才是必要的。

在資料庫連接配接上建立事務處理對象,然後調用事務處理對象來送出事務或復原事務。簡單的代碼:

private void button1_Click(object sender, System.EventArgs e)

  {

   SqlConnection conn = new SqlConnection("Data Source=192.168.2.200;uid=sa; password=;database = HaierHR");

   conn.Open();

   //啟用事務

   SqlTransaction tran = conn.BeginTransaction();

   SqlCommand cmd = new SqlCommand();

   cmd.Connection = conn;

   cmd.Transaction = tran;

   try

   {

    cmd.CommandText = "UPDATE HRRollMain Set TotalMember=TotalMember-100 WHERE RollID = '2005070101'";

    cmd.ExecuteNonQuery();

    cmd.CommandText = "UPDATE HRRollSum Set TotalSumMember=TotalSumMember+100 WHERE RollSumID = '20050701'";

    cmd.ExecuteNonQuery();

    tran.Commit();

    MessageBox.Show("事務送出成功!");

   }

   catch(Exception ex)

   {

    tran.Rollback();

    MessageBox.Show("Error!"+ex.Message);

   }   

  }

使用ADO.NET配置SQL Server事務處理

PCPPC.CN  教程來源:作者:  欄目:SQLserver教程  更新時間:較新  字型尺寸:縮小 放大您正在看的SQLserver教程是:使用ADO.NET配置SQL Server事務處理。

    ADO.NET提供了處理背景資料所需要的一切功能,并且使用起來就如同從一張表格中讀取一個資料那樣簡單。事務處理(transaction)允許你把資料庫操作歸為一組,由此來保證所有的操作都能夠執行。因為一旦其中的一項操作執行失敗,則整個事務處理都會失敗。現在讓我們來看看在.NET Framework下是如何使用事務處理的。

    事務處理概況

    事務處理是把一組操作合并為一個邏輯上的工作單元。在系統中沒有出現錯誤的情況下,開發人員可以使用事務處理來控制并保持事務進行中每一個動作的連續性和完整性。

    使用這樣的方法可能導緻向兩個極端情況發展:要麼在事務進行中的所有操作都得到執行,要麼沒有任何操作得到執行。這樣的方法對于實時應用程式來說非常必要。

    銀行業務是一個範例。事務處理應當包括從一個帳戶到另一帳戶的轉帳過程。這一過程屬于事務處理,原因是從某帳戶中支出和在另一帳戶存入兩個動作必須被作為一個整體來執行——任何一方都不允許失敗。在深入研究ADO.NET程式設計之前,讓我們先來看看在SQL中是如何進行事務處理的。

SQL事務處理

SQL允許開發人員使用兩個簡單的聲明來使用事務處理

Begin Transaction (啟動事務處理)

Commit Transaction (送出事務處理)

    在兩條聲明中的所有語句都成為事務處理的一部分。指令Begin Transaction位于整個事務處理的起始位置,是以其後的所有指令隻有在執行到指令Commit Transaction時才會被一并執行。ADO.NET方法就這麼簡單。

ADO.NET事務處理

    事務處理需要一個資料庫連接配接以及一個事務處理對象。在SQL Server和ADO.NET中使用事務處理的難點在于SqlTransaction類。此類名稱随所使用的資料庫平台的不同而會有一些變化。例如,對于OLEDB資料庫來說,事務處理類名為OleDbTransaction。

System.Data.SqlClient namespace包括了SqlTransaction類。此類包括了兩個屬性:

Connection:訓示同僚務處理相關聯的SqlConnection對象;

IsolationLevel:定義事務處理的IsolationLevel。

屬性IsolationLevel是包括如下成員的枚舉對象:

Chaos:從高度獨立的事務進行中出現的pending changes不能被覆寫;

ReadCommitted:當資料需要被非惡意讀取時,采用共享鎖定(shared locks),但資料仍然可以在事務處理結束時被更新,這造成了非重複性的資料讀取(nonrepeatable reads)或phantom data的産生;

ReadUncommitted:惡意讀取資料是可能發生的,這表示沒有使用共享鎖定(shared locks),并且沒有實作獨占鎖定(exclusive locks);

RepeatableRead:鎖定查詢中所用到的所有資料,由此避免其他使用者對資料進行更新。在phantom rows仍然可用的狀态下,這可以避免非重複性的資料讀取(nonrepeatable reads);

Serialisable:在DataSet中進行範圍鎖定,由此防止其他使用者在事務處理結束之前更新資料或在資料庫中插入行;

IsolationLevel定義鎖定記錄的級别,但這一概念不在本文論述範圍之内。對象SqlTransaction也提供了類似的方法。你可以使用以下方法來進行事務處理:

Commit:送出資料庫事務處理;

Rollback:從未決狀态(pending state)反轉(roll back)事務處理。事務處理一旦被送出後即不能執行此操作;

Save:在事務進行中建立savepoint可以對事務處理的一部分進行反轉,并且指定savepoint名稱。

    以下的C#示例将這些部分綜合起來。

    這一簡單的控制台程式将通過以下步驟将兩行插入到Northwind資料庫的表格中:

    調用Connection對象的BeginTransaction方法以标記事務處理的起始位置。BeginTransaction方法對事務處理傳回了一個坐标(reference),此坐标被指定給事務處理所用到的Command對象。

    将Transaction對象指定給将要執行的Command的Transaction屬性。如果某Command在活動Transaction中的Connection上被執行,并且Transaction對象還沒有被指定到Command的Transaction屬性,則會産生一個異常。

    調用Transaction對象的Commit方法來結束事務處理,或者調用Rollback方法來取消事務處理。

    等價的VB.NET代碼與之類似。

    事務處理結束

    盡管這是一個簡單的示例,但它還是充分顯示了在.NET應用程式中使用事務處理是多麼的簡單。請記住,事務處理隻有在處理一組指令時才是必要的。