日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

ADO.NET事物

發(fā)布時間:2025/6/17 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ADO.NET事物 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一 事務處理介紹
事務是這樣一種機制,它確保多個SQL語句被當作單個工作單
元來處理。事務具有以下的作用:
* 一致性:同時進行的查詢和更新彼此不會發(fā)生沖突,其他
用戶不會看到發(fā)生了變化但尚未提交的數(shù)據(jù)。
* 可恢復性:一旦系統(tǒng)故障,數(shù)據(jù)庫會自動地完全恢復未完
成的事務。

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

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


Ado.Net事務處理。
在ADO.NET 中,可以使用Connection 和Transaction 對象來控制事務。若要執(zhí)行事務,請執(zhí)行下列操作:
? 調用Connection 對象的BeginTransaction 方法來標記事務的開始。
? 將Transaction 對象分配給要執(zhí)行的Command的Transaction 屬性。
? 執(zhí)行所需的命令。
? 調用Transaction 對象的Commit 方法來完成事務,或調用Rollback 方法來取消事務。
當然ADO.NET事務處理有優(yōu)點和缺點,運用起來看具體情況了。
? 優(yōu)點:
– 簡單性
– 和數(shù)據(jù)據(jù)事務差不多的快
– 獨立于數(shù)據(jù)庫,不同數(shù)據(jù)庫的專有代碼被隱藏了
? 缺點:
– 事務不能跨越多個數(shù)據(jù)庫連接
– 事務執(zhí)行在數(shù)據(jù)庫連接層上,所以需要在事務過程中維護一個數(shù)據(jù)庫連接。
下邊我們看一個例子,建立一個頁面,同樣簡單,只需要一個按鈕,然后編程:
?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????????????//為事務創(chuàng)建一個命令,注意我們執(zhí)行雙條命令,第一次執(zhí)行當然成功。我們再執(zhí)行一次,失敗。
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("成功執(zhí)行");
42
43????????????}

44????????????catch?(Exception Ex)
45????????????{
46????????????????myTran.Rollback();
47????????????????//創(chuàng)建并且返回異常的錯誤信息
48????????????????Response.Write(Ex.ToString());
49????????????????Response.Write("寫入數(shù)據(jù)庫失敗");
50????????????}

51????????????finally
52????????????{
53????????????????con.Close();
54????????????}

55?
56????????}

57
58
59????}

60}
?

轉載于:https://www.cnblogs.com/treasurelife/archive/2009/01/17/1377459.html

總結

以上是生活随笔為你收集整理的ADO.NET事物的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。