ADO.NET事務處理
一 事務處理介紹
事務是這樣一種機制,它確保多個SQL語句被當作單個工作單
元來處理。事務具有以下的作用:
* 一致性:同時進行的查詢和更新彼此不會發生沖突,其他
用戶不會看到發生了變化但尚未提交的數據。
* 可恢復性:一旦系統故障,數據庫會自動地完全恢復未完
成的事務。
二 事務與一致性
事務是完整性的單位,一個事務的執行是把數據庫從一個一
致的狀態轉換成另一個一致的狀態。因此,如果事務孤立執行時
是正確的,但如果多個事務并發交錯地執行,就可能相互干擾,
造成數據庫狀態的不一致。在多用戶環境中,數據庫必須避免同
時進行的查詢和更新發生沖突。這一點是很重要的,如果正在被
處理的數據能夠在該處理正在運行時被另一用戶的修改所改變,
那么該處理結果是不明確的。
不加控制的并發存取會產生以下幾種錯誤:
1 丟失修改(lost updates)
當多個事務并發修改一個數據時,不加控制會得出錯誤的結
果,一個修改會覆蓋掉另一個修改。
2 讀的不可重復性
當多個事務按某種時間順序存取若干數據時,如果對并發存
取不加控制,也會產生錯誤。
3 臟讀(DIRDY DATA),讀的不一致性
4 光標帶來的當前值的混亂
事務在執行過程中它在某個表上的當前查找位置是由光標表
示的。光標指向當前正處理的記錄。當處理完該條記錄后,則指
向下一條記錄。在多個事務并發執行時,某一事務的修改可能產
生負作用,使與這些光標有關的事務出錯。
5 未釋放修改造成連鎖退出
一個事務在進行修改操作的過程中可能會發生故障,這時需
要將已做的修改回退(Rollback)。如果在已進行過或已發現錯
誤尚未復原之前允許其它事務讀已做過修改(臟讀),則會導致
連鎖退出。
6 一事務在對一表更新時,另外的事務卻修改或刪除此表的
定義。
數據庫會為每個事務自動地設置適當級別的鎖定。對于前面
講述的問題:臟讀、未釋放修改造成的連鎖退出、一事務在對一
表更新時另外的事務卻修改或刪除此表的定義,數據庫都會自動
解決。而另外的三個問題則需要在編程過程中人為地定義事務或
加鎖來解決。
三 事務和恢復
數據庫本身肩負著管理事務的責任。事務是最小的邏輯工作
單元,在這個工作單元中,對數據庫的所有更新工作,要么必須
全部成功,要么必須全部失?。ɑ赝耍?。只要應用程序指定了某
段程序為一個事務并做了相應的處理(提交或回退),數據庫系
統會自動維護事務本身的特性。
四 ORACLE數據庫的事務定義
ORACLE事務從COMMIT、ROLLBACK、連接到數據庫或開始第一
條可執行的SQL語句時開始,到一條COMMIT、ROLLBACK語句或退出
數據庫時結束。如果在一個事務中包含DDL語句,則在DDL語句的
前后都會隱含地執行COMMIT語句,從而開始或結束一個事務。
如果一個事務由于某些故障或者由于用戶改變主意而必須在
提交前取消它,則數據庫被恢復到這些語句和過程執行之前的狀
態。
利用ROLLBACK語句可以在COMMIT命令前隨時撤消或回退一個
事務??梢曰赝苏麄€事務,也可以會退部分事務,但是不能回退
一個已經被提交的事務?;赝瞬糠质聞盏腞OLLBACK命令為:
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事務處理有優點和缺點,運用起來看具體情況了。
? 優點:
– 簡單性
– 和數據據事務差不多的快
– 獨立于數據庫,不同數據庫的專有代碼被隱藏了
? 缺點:
– 事務不能跨越多個數據庫連接
– 事務執行在數據庫連接層上,所以需要在事務過程中維護一個數據庫連接。
下邊我們看一個例子,建立一個頁面,同樣簡單,只需要一個按鈕,然后編程:
事務是這樣一種機制,它確保多個SQL語句被當作單個工作單
元來處理。事務具有以下的作用:
* 一致性:同時進行的查詢和更新彼此不會發生沖突,其他
用戶不會看到發生了變化但尚未提交的數據。
* 可恢復性:一旦系統故障,數據庫會自動地完全恢復未完
成的事務。
二 事務與一致性
事務是完整性的單位,一個事務的執行是把數據庫從一個一
致的狀態轉換成另一個一致的狀態。因此,如果事務孤立執行時
是正確的,但如果多個事務并發交錯地執行,就可能相互干擾,
造成數據庫狀態的不一致。在多用戶環境中,數據庫必須避免同
時進行的查詢和更新發生沖突。這一點是很重要的,如果正在被
處理的數據能夠在該處理正在運行時被另一用戶的修改所改變,
那么該處理結果是不明確的。
不加控制的并發存取會產生以下幾種錯誤:
1 丟失修改(lost updates)
當多個事務并發修改一個數據時,不加控制會得出錯誤的結
果,一個修改會覆蓋掉另一個修改。
2 讀的不可重復性
當多個事務按某種時間順序存取若干數據時,如果對并發存
取不加控制,也會產生錯誤。
3 臟讀(DIRDY DATA),讀的不一致性
4 光標帶來的當前值的混亂
事務在執行過程中它在某個表上的當前查找位置是由光標表
示的。光標指向當前正處理的記錄。當處理完該條記錄后,則指
向下一條記錄。在多個事務并發執行時,某一事務的修改可能產
生負作用,使與這些光標有關的事務出錯。
5 未釋放修改造成連鎖退出
一個事務在進行修改操作的過程中可能會發生故障,這時需
要將已做的修改回退(Rollback)。如果在已進行過或已發現錯
誤尚未復原之前允許其它事務讀已做過修改(臟讀),則會導致
連鎖退出。
6 一事務在對一表更新時,另外的事務卻修改或刪除此表的
定義。
數據庫會為每個事務自動地設置適當級別的鎖定。對于前面
講述的問題:臟讀、未釋放修改造成的連鎖退出、一事務在對一
表更新時另外的事務卻修改或刪除此表的定義,數據庫都會自動
解決。而另外的三個問題則需要在編程過程中人為地定義事務或
加鎖來解決。
三 事務和恢復
數據庫本身肩負著管理事務的責任。事務是最小的邏輯工作
單元,在這個工作單元中,對數據庫的所有更新工作,要么必須
全部成功,要么必須全部失?。ɑ赝耍?。只要應用程序指定了某
段程序為一個事務并做了相應的處理(提交或回退),數據庫系
統會自動維護事務本身的特性。
四 ORACLE數據庫的事務定義
ORACLE事務從COMMIT、ROLLBACK、連接到數據庫或開始第一
條可執行的SQL語句時開始,到一條COMMIT、ROLLBACK語句或退出
數據庫時結束。如果在一個事務中包含DDL語句,則在DDL語句的
前后都會隱含地執行COMMIT語句,從而開始或結束一個事務。
如果一個事務由于某些故障或者由于用戶改變主意而必須在
提交前取消它,則數據庫被恢復到這些語句和過程執行之前的狀
態。
利用ROLLBACK語句可以在COMMIT命令前隨時撤消或回退一個
事務??梢曰赝苏麄€事務,也可以會退部分事務,但是不能回退
一個已經被提交的事務?;赝瞬糠质聞盏腞OLLBACK命令為:
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 }
60}
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 }
60}

浙公網安備 33010602011771號