c#事務的使用、示例及注意事項

一、事務的介紹
.NET Framework 開發員指南
事務是一組組合成邏輯工作單元的操作,雖然系統中可能會出錯,但事務將控制和維護事務中每個操作的一致性和完整性。
例如,在將資金從一個帳戶轉移到另一個帳戶的銀行應用中,一個帳戶將一定的金額貸記到一個數據庫表中,同時另一個帳戶將相同的金額借記到另一個數據庫表中。由于計算機可能會因停電、網絡中斷等而出現故障,因此有可能更新了一個表中的行,但沒有更新另一個表中的行。如果數據庫支持事務,則可以將數據庫操作組成一個事務,以防止因這些事件而使數據庫出現不一致。如果事務中的某個點發生故障,則所有更新都可以回滾到事務開始之前的狀態。如果沒有發生故障,則通過以完成狀態提交事務來完成更新。
在 ADO.NET 中,可以使用 Connection 和 Transaction 對象來控制事務。可以使用 Connection.BeginTransaction 啟動本地事務。一旦開始一個事務,就可以使用 Command 對象的 Transaction 屬性在該事務中登記命令。然后,可以根據事務組件的成功或失敗情況,使用 Transaction 對象提交或回滾在數據源中所做的修改。
還可以使用 Connection.EnlistDistributedTransaction 在現有的分布式事務中登記。在現有的分布式事務中登記可以確保當提交或回滾整個分布式事務時,也提交或回滾對數據源所作的代碼修改。
以下示例創建一個 OleDbConnection 和一個 OleDbTransaction。它還演示了如何使用 BeginTransaction、Commit 和 Rollback 方法。

?

ExpandedBlockStart.gif代碼
public?void?RunOleDbTransaction(string?myConnString)
{
OleDbConnection?myConnection?
=?new?OleDbConnection(myConnString);
myConnection.Open();
OleDbCommand?myCommand?
=?myConnection.CreateCommand();
OleDbTransaction?myTrans;

//?Start?a?local?transaction
myTrans?=?myConnection.BeginTransaction(IsolationLevel.ReadCommitted);
//?Assign?transaction?object?for?a?pending?local?transaction
myCommand.Connection?=?myConnection;
myCommand.Transaction?
=?myTrans;
try
{
myCommand.CommandText?
=?\"Insert?into?Region?(RegionID,?RegionDescription)?VALUES?(100,?\'Description\')\";
myCommand.ExecuteNonQuery();
myCommand.CommandText?
=?\"Insert?into?Region?(RegionID,?RegionDescription)?VALUES?(101,?\'Description\')\";
myCommand.ExecuteNonQuery();
myTrans.Commit();
Console.WriteLine(\
"Both?records?are?written?to?database.\");
}
catch(Exception?e)
{
try
{
myTrans.Rollback();
}
catch?(OleDbException?ex)
{
if?(myTrans.Connection?!=?null)
{
Console.WriteLine(\
"An?exception?of?type?\"?+?ex.GetType()?+
\
"?was?encountered?while?attempting?to?roll?back?the?transaction.\");
}
}

Console.WriteLine(\
"An?exception?of?type?\"?+?e.GetType()?+
\
"?was?encountered?while?inserting?the?data.\");
Console.WriteLine(\
"Neither?record?was?written?to?database.\");
}
finally?
{
myConnection.Close();
}
}

?

OleDbTransaction.Commit 方法
提交數據庫事務。
public virtual void Commit();
OleDbTransaction.Rollback 方法
從掛起狀態回滾事務。
public virtual void Rollback();
OleDbConnection.BeginTransaction 方法
開始數據庫事務。
public OleDbTransaction BeginTransaction();
以當前的 IsolationLevel 值開始數據庫事務。
public OleDbTransaction BeginTransaction(IsolationLevel);
IsolationLevel 枚舉?
指定連接的事務鎖定行為。 在執行事務時,.NET Framework 數據提供程序使用 IsolationLevel 值。在顯式更改之前,IsolationLevel 保持有效,但是可以隨時對它進行更改。新值在執行時使用,而不是在分析時使用。如果在事務期間更改,服務器的預期行為是,對其余所有語句應用新的鎖定級別。
IsolationLevel成員 ReadCommitted
在正在讀取數據時保持共享鎖,以避免臟讀,但是在事務結束之前可以更改數據,從而導致不可重復的讀取或幻像數據。
OleDbConnection.CreateCommand 方法
創建和返回一個與 OleDbConnection 相關聯的 OleDbCommand 對象。
public OleDbCommand CreateCommand();
OleDbCommand.Connection 屬性
獲取或設置 OleDbCommand 的此實例使用的 OleDbConnection。
public OleDbConnection Connection {get; set;}


如何在.NET中實現事務(1)
?
如何在.NET中實現事務機制呢? 通常可以使用2種方式: 直接寫入到sql 中;使用ADO.NET 實現。下面依次作一下介紹:
方法1:直接寫入到sql 中
使用 BEGIN TRANS, COMMIT TRANS, ROLLBACK TRANS 實現:
例如
BEGIN TRANS
DECLARE @orderDetailsError int, @productError int
DELETE FROM \"Order Details\" WHERE ProductID=42
SELECT @orderDetailsError = @@ERROR
DELETE FROM Products WHERE ProductID=42
SELECT @productError = @@ERROR
IF @orderDetailsError = 0 AND @productError = 0
COMMIT TRANS
ELSE
ROLLBACK TRANS
這種方法比較簡單,具體可以查閱相關sql server 幫助

方法2 :使用ADO.NET 實現,使用這種方式的優點是可以在中間層來管理事務,當然你也可以選擇在數據層來實現。
SqlConnection 和OleDbConnection 對象有一個 BeginTransaction 方法,它可以返回 SqlTransaction 或者OleDbTransaction 對象。而且這個對象有 Commit 和 Rollback 方法來管理事務,具體例子如下:

cnNorthwind.Open()
Dim trans As SqlTransaction = cnNorthwind.BeginTransaction()
Dim cmDel As New SqlCommand()
cmDel.Connection = cnNorthwind
cmDel.Transaction = trans

Try
cmDel.CommandText = _
\"DELETE [Order Details] WHERE ProductID = 42\"
cmDel.ExecuteNonQuery()
cmDel.CommandText = \"DELETE Products WHERE ProductID = 42\"
cmDel.ExecuteNonQuery()
trans.Commit()

Catch Xcp As Exception
trans.Rollback()
Finally
cnNorthwind.Close()
End Try

Ok,通過上面的例子可以實現與方法1同樣的效果。

并發問題:

如果沒有鎖定且多個用戶同時訪問一個數據庫,則當他們的事務同時使用相同的數據時可能會發生問題。并發問題包括: 丟失或覆蓋更新,未確認的相關性(臟讀),不一致的分析(非重復讀),幻像讀。但是如何來避免數據讀取時臟讀等問題出現呢?
?
二、事務實例

using(SqlTransaction?trans?=?conn.BeginTransaction())
{
  
try
  {
?
//循環進行信息的插入
?for(int?count?=?0;?count?<?applyInfo.Length;?count?++)
?{
?  
//聲明參數并賦值
?  SqlParameter[]?parms?=?
{ Database.MakeInParam (\
"@Stu_ID\",System.Data.SqlDbType.VarChar,11,applyInfocount].StuID),
Database.MakeInParam\
"@Bank_Name\",System.Data.SqlDbType.VarChar,50,applyInfo[count].BankName),??Database.MakeInParam\"@Apply_Loan_Money\",System.Data.SqlDbType.Money,8,applyInfo[count].ApplyLoanMoney),?Database.MakeInParam(\"@Apply_Loan_Year\",System.Data.SqlDbType.VarChar,20,applyInfo[count].ApplyLoanYear),??Database.MakeInParam\"@Apply_Year\",System.Data.SqlDbType.Char,6,applyInfo[count].ApplyYear),???????Database.MakeInParam(\"@Apply_Length\",System.Data.SqlDbType.Int,4,applyInfo[count].ApplyLength),???????Database.MakeInParam(\"@Apply_Pass\",System.Data.SqlDbType.Char,1,applyInfo[count].ApplyPass),
Database.MakeInParam(\
"@Apply_Remark\",System.Data.SqlDbType.VarChar,100,applyInfo[count].ApplyRemark)
      ??};
? 
//執行新增操作
? SqlHelper.ExecuteNonQuery(trans,CommandType.StoredProcedure,?\"ApplyInfo_Create\",?parms);
}
      
//未出現錯誤,則提交事務
?  trans.Commit();
?  
return?true;
?  }
       
catch(Exception?ex)
?  {
??
//出錯則回滾
??trans.Rollback();
??
throw?ex;
       }
?}

?

四、注意事項
  事務的定義必須在連接打開后,提交必須在關閉以前
  使用事務時必須即是把事務添加到sqlCommand中去。

轉載于:https://www.cnblogs.com/hayden/archive/2010/01/28/1658114.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276969.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276969.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276969.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鏡像服務器文件實時監控同步程序

這是為我們網站解決南北電信網通互聯互通問題而寫的一個程序。 優游中國(www.yooyocn.com)是一個大型旅游門戶網站&#xff0c;提供了資訊&#xff0c;視頻&#xff0c;圖片&#xff0c;博客&#xff0c;論壇等大數據量的業務內容。 為了使全國各地的網友都能夠快速訪問我們的網…

Nginx學習系列二Linux下Nginx實現負載均衡

關于在本地虛擬機(VMware 14)下安裝Linux同時安裝Nginx,請參考Nginx學習系列之搭建環境 1、啟動Nginx 在Nginx安裝成功的前提下,啟動Nginx 已root模式登陸(權限需要),接著找到Nginx的安裝目錄,啟動Nginx,并且指定Nginx啟動所需的配置文件,該文件也在Nginx的安裝目錄下. 2、查看…

FastCGI中文規范

http://fuzhong1983.blog.163.com/blog/static/1684705201051002951763/ . 介紹 FastCGI是對CGI的開放的擴展&#xff0c;它為所有因特網應用提供高性能&#xff0c;且沒有Web服務器API的缺點&#xff08;penalty&#xff09;。 本規范具有有限的&#xff08;narrow&#xff09…

設計模式初學者系列-策略模式 -------為什么總是繼承

設計模式初學者系列&#xff0d;策略模式 -------為什么總是繼承 模板方法的延續 這篇稿子是基于我的前一篇模板方法設計模式之上演繹的&#xff0c;如果沒有閱讀請點擊這里查看&#xff0c;以了解這篇稿子的上下文。 在模板方法設計模式里我舉了一個例子&#xff1a;教育部…

紅米airdots掉了怎么查找_紅米K30 Pro 榮耀V30pro 這兩款手機該怎么選呢?

點擊?玩機數碼君?關注我&#xff0c;加★星標★你好 我是歲月神偷昨天可以說是小米拍手稱快的一天&#xff0c;紅米K30 Pro以2999的超低價成為目前最便宜的驍龍865旗艦&#xff0c;讓友商拍馬難追。友商明眼人都知道說的華為&#xff0c;怎么感覺小米每次發布會也替華為宣傳了…

返回一個循環整數組最大子數組和

任務要求&#xff1a; 1、輸入一個整形數組&#xff0c;數組里有正數也有負數。 2、數組中連續的一個或多個整數組成一個子數組&#xff0c;每個子數組都有一個和。 3、如果數組A[0]……A[j-1]首尾相鄰&#xff0c;允許A[i-1]&#xff0c; …… A[n-1]&#xff0c; A[0]……A…

中文分詞入門之字標注法4

http://www.52nlp.cn/%E4%B8%AD%E6%96%87%E5%88%86%E8%AF%8D%E5%85%A5%E9%97%A8%E4%B9%8B%E5%AD%97%E6%A0%87%E6%B3%A8%E6%B3%954 上一節主要介紹的是利用最大熵工具包來做字標注中文分詞&#xff0c;這一節我們直奔主題&#xff0c;借用條件隨機場工具“CRF: Yet Another CRF …

后臺設置 datakeynames

FormView2.DataKeyNames new String[] { "ShoppingRemarkID" }; 轉載于:https://www.cnblogs.com/Fernando/archive/2008/01/16/1041717.html

4K 海思 聯詠 芯片_老電視也有春天,換裝海美迪4K電視盒子H7 Plus

寫在前面YALL&#xff0c;大家好&#xff0c;我是老炮兒許老板。疫情進入六月逐漸好轉&#xff0c;各級各類學校相繼開學&#xff0c;年前給兒子報的托班也終于迎來了開學&#xff0c;平日里幫忙照看兒子的爺爺奶奶也終于得到了解放。現在白天有大把大把的時間來追劇看電視&…

知識付費不熱了,得到們接下來故事怎么講?

如今&#xff0c;知識付費風口已過&#xff0c;紅利期隨之在逐漸消失&#xff0c;很多知識付費的創業者也在感嘆生意難做&#xff0c;甚至有人已經開始離場。比如&#xff0c;百度音頻知識付費產品只生存了6個月&#xff0c;最后的更新時間則停在7月13日。再如&#xff0c;在分…

I'm genius,用游戲柄控制鼠標

昨天不小心把鼠標放在店里沒有帶回來&#xff0c;今天電腦就沒有鼠標了&#xff0c;用了很久的鍵盤&#xff0c;實在不爽&#xff0c;就突然發現自己有一個游戲柄&#xff0c;后來到網上查了一下怎么用游戲柄控制鼠標&#xff0c;呵呵&#xff0c;發現了一個&#xff0c;下載用…

WCF從理論到實踐(4):路在何方

本文的出發點 通過閱讀本文&#xff0c;您能了解以下知識&#xff1a; Address是什么&#xff1f; Address的組成&#xff1f; 如何在配置文件中指定Address? 如何通過編程方式設置Address? Address有什么特殊應用&#xff1f; 本文適合的讀者 適合WCF初學者&#xff…

office 2007圖標_微軟Office 365桌面版新圖標開始測試

IT之家3月1日消息 此前&#xff0c;微軟公布了全新的Office圖標&#xff0c;微軟Office 365在線網頁版在2月15日開始已經全面更新新版圖標&#xff0c;而桌面版Office 365現在也陸續開始測試新版圖標。目前微軟Office Dogfood通道上推送的開發者預覽版本已經在2月27日開始測試O…

【動態規劃BFS】相遇

這是我第一次模擬題測試點全部AC。。。 同機房的DALAO都用的BFS 然而我用的DP&#xff08;其實不會BFS&#xff09; 話不多說&#xff0c;上題&#xff01; &#xff08;灰常詳細&#xff09;DP解法&#xff1a; 重點還是狀態轉移方程式的推導 1個點i要么是后面的位置i-1往前走…

Ruby on Rails 通過代理遠程安裝

在網上查了一些資料&#xff0c;都不詳細&#xff0c;現在列出標準命令&#xff1a; 1。如果代理服務器需要認證 gem install rails --include-dependencies --http-proxy http://username:passwordproxy:port 2。如果代理服務器不需要認證 gem install rails --include-depend…

五個思路,教你如何建立金融業的數據分析管理模型

說起銀行、保險、股票投資這樣的金融行業&#xff0c;很多人都認為它們是依靠數據驅動的企業&#xff0c;畢竟大數據的誕生本來就是為了金融信息流通而服務的&#xff0c;但在我身邊很多搞證券、投資的朋友看來&#xff0c;事實卻并非如此。 真正在金融行業做數據分析的人&…

【SSH網上商城項目實戰19】訂單信息的級聯入庫以及頁面的緩存問題

購物車這一塊還剩最后兩個問題&#xff0c;就是訂單信息的級聯入庫和頁面緩存&#xff0c;這里的信息是指購物車和購物項&#xff0c;即我們將購物車的信息存入數據庫的同時&#xff0c;也存入每個購物項的信息&#xff0c;而且外鍵都關聯好&#xff0c;這涉及到了Hibernate中的…

exfat分配單元大小選多少_安防監控攝像機視角大小和鏡頭毫米數的基礎知識!...

關于選擇監控鏡頭毫米數的問題&#xff0c;雖然只有新手才有此困惑&#xff0c;但是我們還是要認真地說一說。監控視角&#xff0c;就是指監控照射的鏡頭所能覆蓋到的范圍&#xff0c;就是監控畫面所能看到的角度統稱叫監控視角。我們正常選購監控的時候&#xff0c;除了可以選…

彩信編輯器之預覽功能

html代碼 <table width"200"height"250"border"0"cellpadding"0"cellspacing"0"bgcolor"#666666"><tr><td align"center"valign"middle"><marquee id"MMScreen&qu…

java 幾個實用的小工具

1、除法運算 編程的人都知道&#xff0c;java中的“/”、“%”運算&#xff0c;其中前者為取整&#xff0c;后者取余數。那么有沒有快捷的運算方法取正常的運算結果呢&#xff1f; 查了資料&#xff0c;發現很簡單。代碼如下&#xff1a; public static String txfloat(int a,i…