日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ADO.NET事物

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

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

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


Ado.Net事務(wù)處理。
在ADO.NET 中,可以使用Connection 和Transaction 對象來控制事務(wù)。若要執(zhí)行事務(wù),請執(zhí)行下列操作:
? 調(diào)用Connection 對象的BeginTransaction 方法來標(biāo)記事務(wù)的開始。
? 將Transaction 對象分配給要執(zhí)行的Command的Transaction 屬性。
? 執(zhí)行所需的命令。
? 調(diào)用Transaction 對象的Commit 方法來完成事務(wù),或調(diào)用Rollback 方法來取消事務(wù)。
當(dāng)然ADO.NET事務(wù)處理有優(yōu)點(diǎn)和缺點(diǎn),運(yùn)用起來看具體情況了。
? 優(yōu)點(diǎn):
– 簡單性
– 和數(shù)據(jù)據(jù)事務(wù)差不多的快
– 獨(dú)立于數(shù)據(jù)庫,不同數(shù)據(jù)庫的專有代碼被隱藏了
? 缺點(diǎn):
– 事務(wù)不能跨越多個數(shù)據(jù)庫連接
– 事務(wù)執(zhí)行在數(shù)據(jù)庫連接層上,所以需要在事務(wù)過程中維護(hù)一個數(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????????????//啟動一個事務(wù)。
28????????????SqlTransaction myTran =?con.BeginTransaction();
29????????????//為事務(wù)創(chuàng)建一個命令,注意我們執(zhí)行雙條命令,第一次執(zhí)行當(dāng)然成功。我們再執(zhí)行一次,失敗。
30????????????//第三次我們改其中一個命令,另一個不改,這時候事務(wù)會報錯,這就是事務(wù)機(jī)制。
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}
?

轉(zhuǎn)載于:https://www.cnblogs.com/treasurelife/archive/2009/01/17/1377459.html

總結(jié)

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

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