轉,ASP.net交易處理

來源:互聯網
上載者:User
 交易處理介紹
事務是這樣一種機制,它確保多個SQL語句被當作單個工作單
元來處理。事務具有以下的作用:
* 一致性:同時進行的查詢和更新彼此不會發生衝突,其他
使用者不會看到發生了變化但尚未提交的資料。
* 可恢複性:一旦系統故障,資料庫會自動地完全恢複未完
成的事務。

二 事務與一致性
事務是完整性的單位,一個事務的執行是把資料庫從一個一
致的狀態轉換成另一個一致的狀態。因此,如果事務孤立執行時
是正確的,但如果多個事務並發交錯地執行,就可能相互幹擾,
造成資料庫狀態的不一致。在多使用者環境中,資料庫必須避免同
時進行的查詢和更新發生衝突。這一點是很重要的,如果正在被
處理的資料能夠在該處理正在運行時被另一使用者的修改所改變,
那麼該處理結果是不明確的。
不加控制的並發存取會產生以下幾種錯誤:
1 丟失修改(lost updates)
當多個事務並發修改一個資料時,不加控制會得出錯誤的結
果,一個修改會覆蓋掉另一個修改。
2 讀的不可重複性
當多個事務按某種時間順序存取若干資料時,如果對並發存
取不加控制,也會產生錯誤。
3 髒讀(DIRDY DATA),讀的不一致性
4 游標帶來的當前值的混亂
事務在執行過程中它在某個表上的當前尋找位置是由游標表
示的。游標指向當前正處理的記錄。當處理完該條記錄後,則指
向下一條記錄。在多個事務並發執行時,某一事務的修改可能產
生負作用,使與這些游標有關的事務出錯。
5 未釋放修改造成連鎖退出
一個事務在進行修改操作的過程中可能會發生故障,這時需
要將已做的修改回退(Rollback)。如果在已進行過或已發現錯
誤尚未複原之前允許其它事務讀已做過修改(髒讀),則會導致
連鎖退出。
6 一事務在對一表更新時,另外的事務卻修改或刪除此表的
定義。
資料庫會為每個事務自動地設定適當層級的鎖定。對於前面
講述的問題:髒讀、未釋放修改造成的連鎖退出、一事務在對一
表更新時另外的事務卻修改或刪除此表的定義,資料庫都會自動
解決。而另外的三個問題則需要在編程過程中人為地定義事務或
加鎖來解決。
三 事務和恢複
資料庫本身肩負著管理事務的責任。事務是最小的邏輯工作
單元,在這個工作單元中,對資料庫的所有更新工作,要麼必須
全部成功,要麼必須全部失敗(回退)。只要應用程式指定了某
段程式為一個事務並做了相應的處理(提交或回退),資料庫系
統會自動維護事務本身的特性。

四 ORACLE資料庫的事務定義
ORACLE事務從COMMIT、ROLLBACK、串連到資料庫或開始第一
條可執行檔SQL語句時開始,到一條COMMIT、ROLLBACK語句或退出
資料庫時結束。如果在一個事務中包含DDL語句,則在DDL語句的
前後都會隱含地執行COMMIT語句,從而開始或結束一個事務。
如果一個事務由於某些故障或者由於使用者改變主意而必須在
提交前取消它,則資料庫被恢複到這些語句和過程執行之前的狀
態。
利用ROLLBACK語句可以在COMMIT命令前隨時撤消或回退一個
事務。可以回退整個事務,也可以會退部分事務,但是不能回退
一個已經被提交的事務。回退部分事務的ROLLBACK命令為:
ROLLBACK to savepoint 儲存點名
儲存點是使用者放入事務中的標記,用來表示一個可被回退的
位置。儲存點通過在事務中放入一個SAVEPOINT命令而被插入。該
命令的文法是:
SAVEPOINT 儲存點名
如果在ROLLBACK語句中沒有給出儲存點名,則整個事務被回
退。
五 SYBASE資料庫的事務定義
SYBASE通過使用BEGIN TRANsaction和COMMIT TRANsaction命令指
示SQL將任意數目的語句作為一個單元來處理。ROLLBACK TRANsaction
命令則允許使用者恢複到事務的開始,或恢複到事務內部已經被用SAVE
TRANsaction命令定義的儲存點上。
BEGIN TRANsaction和COMMIT TRANsaction能夠包含任意數目的SQL
語句和預存程序,方法很簡單:
BEGIN TRANsaction [事務名稱]
COMMIT TRANsaction
如果一個事務由於某些故障或者由於使用者改變主意而必須在提交
前取消它,則資料庫被恢複到這些語句和過程執行之前的狀態。
利用ROLLBACK TRANsaction命令可以在COMMIT TRANsaction命令
前隨時回退一個事務。可以回退整個事務,也可以回退部分事務,但
是不能回退一個已經被提交的事務。ROLLBACK TRANsaction命令為:
ROLLBACK TRANsaction [事務名|儲存點名]
儲存點名是使用者放入事務中的標記,用來表示一個可以被回退的
位置。儲存點名通過在事務中放入一個SAVE TRANsaction命令而被插
入。該命令的句法是:
SAVE TRANsaction 儲存點名
如果在ROLLBACK TRANsaction中沒有給出儲存點名或事務名,則
事務被回退到批處理中的第一個BEGIN TRANsaction語句處。
---------------------------------------------------------------------------------------------------------------------------------

Ado.Net交易處理。
在ADO.NET 中,可以使用Connection 和Transaction 對象來控制事務。若要執行事務,請執行下列操作:
• 調用Connection 對象的BeginTransaction 方法來標記事務的開始。
• 將Transaction 對象分配給要執行的Command的Transaction 屬性。
• 執行所需的命令。
• 調用Transaction 對象的Commit 方法來完成事務,或調用Rollback 方法來取消事務。
當然ADO.NET交易處理有優點和缺點,運用起來看具體情況了。
• 優點:
– 簡單性
– 和資料據事務差不多的快
– 獨立於資料庫,不同資料庫的專有代碼被隱藏了
• 缺點:
– 事務不能跨越多個資料庫連接
– 事務執行在資料庫連接層上,所以需要在事務過程中維護一個資料庫連接。
下邊我們看一個例子,建立一個頁面,同樣簡單,只需要一個按鈕,然後編程:
 1using System;
 2using System.Data;
 3using System.Configuration;
 4using System.Collections;
 5using System.Web;
 6using System.Web.Security;
 7using System.Web.UI;
 8using System.Web.UI.WebControls;
 9using System.Web.UI.WebControls.WebParts;
10using System.Web.UI.HtmlControls;
11using System.Data.SqlClient;
12
13namespace WebApplication1
14{
15    public partial class AdoAction : System.Web.UI.Page
16    {
17        protected void Page_Load(object sender, EventArgs e)
18        {
19
20        }
21
22        protected void btn_Click(object sender, EventArgs e)
23        {
24            SqlConnection con = new SqlConnection();
25            con.ConnectionString=ConfigurationManager.ConnectionStrings["DSN"].ConnectionString;
26            con.Open();
27            //啟動一個事務。
28            SqlTransaction myTran = con.BeginTransaction();
29            //為事務建立一個命令,注意我們執行雙條命令,第一次執行當然成功。我們再執行一次,失敗。
30            //第三次我們改其中一個命令,另一個不改,這時候事務會報錯,這就是事務機制。
31            SqlCommand myCom = new SqlCommand();
32            myCom.Connection = con;
33            myCom.Transaction = myTran;
34            try
35            {
36                myCom.CommandText = "insert into SqlAction values ('測試2','111')";
37                myCom.ExecuteNonQuery();
38                myCom.CommandText = "insert into SqlAction values ('測試3','111')";
39                myCom.ExecuteNonQuery();
40                myTran.Commit();
41                Response.Write("成功執行");
42
43            }
44            catch (Exception Ex)
45            {
46                myTran.Rollback();
47                //建立並且返回異常的錯誤資訊
48                Response.Write(Ex.ToString());
49                Response.Write("寫入資料庫失敗");
50            }
51            finally
52            {
53                con.Close();
54            }
55 
56        }
57
58
59    }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.