下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、事務(wù)機(jī)制什么叫事務(wù)?同步發(fā)生數(shù)據(jù)更新時(shí),防止數(shù)據(jù)的不一致。這些就是數(shù)據(jù)庫特有的術(shù)語了。數(shù)據(jù)庫事務(wù)是指作為單個(gè)邏輯工作單元執(zhí)行的一系列操作。設(shè)想網(wǎng)上購物的一次交易,其付款過程至少包括以下幾步數(shù)據(jù)庫操作: 更新客戶所購商品的庫存信息 保存客戶付款信息 -可能包括與銀行系統(tǒng)的交互 生成訂單并且保存到數(shù)據(jù)庫中 更新用戶相關(guān)信息,例如購物數(shù)量等等正常的情況下,這些操作將順利進(jìn)行,最終交易成功,與交易相關(guān)的所有數(shù)據(jù)庫信息也成功地 更新。但是,如果在這一系列過程中任何一個(gè)環(huán)節(jié)出了差錯(cuò),例如在更新商品庫存信息時(shí)發(fā)生異常、 該顧客銀行帳戶存款不足等,都將導(dǎo)致交易失敗。一旦交易失敗,數(shù)據(jù)庫中所有信息都必須保持交
2、易前的狀態(tài)不變,比如最后一步更新用戶信息時(shí)失敗而導(dǎo)致交易失敗,那么必須保證這筆失敗的交 易不影響數(shù)據(jù)庫的狀態(tài)-庫存信息沒有被更新、用戶也沒有付款,訂單也沒有生成。否則,數(shù)據(jù)庫的信息將會(huì)一片混亂而不可預(yù)測(cè)。數(shù)據(jù)庫事務(wù)正是用來保證這種情況下交易的平穩(wěn)性和可預(yù)測(cè)性的技術(shù)。數(shù)據(jù)庫事務(wù)的 ACID屬性事務(wù)處理可以確保除非事務(wù)性單元內(nèi)的所有操作都成功完成,否則不會(huì)永久更新面向數(shù)據(jù)的資 源。通過將一組相關(guān)操作組合為一個(gè)要么全部成功要么全部失敗的單元,可以簡(jiǎn)化錯(cuò)誤恢復(fù)并使應(yīng) 用程序更加可靠。一個(gè)邏輯工作單元要成為事務(wù),必須滿足所謂的ACID(原子性、一致性、隔離性和持久性)屬性: 原子性事務(wù)必須是原子工作單元
3、;對(duì)于其數(shù)據(jù)修改,要么全都執(zhí)行,要么全都不執(zhí)行。通常,與某個(gè) 事務(wù)關(guān)聯(lián)的操作具有共同的目標(biāo),并且是相互依賴的。如果系統(tǒng)只執(zhí)行這些操作的一個(gè)子集,則可 能會(huì)破壞事務(wù)的總體目標(biāo)。原子性消除了系統(tǒng)處理操作子集的可能性。 一致性事務(wù)在完成時(shí),必須使所有的數(shù)據(jù)都保持一致狀態(tài)。在相關(guān)數(shù)據(jù)庫中,所有規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持所有數(shù)據(jù)的完整性。事務(wù)結(jié)束時(shí),所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(如B樹索引或雙向鏈表)都必須是正確的。某些維護(hù)一致性的責(zé)任由應(yīng)用程序開發(fā)人員承擔(dān),他們必須確保應(yīng)用程序 已強(qiáng)制所有已知的完整性約束。例如,當(dāng)開發(fā)用于轉(zhuǎn)帳的應(yīng)用程序時(shí),應(yīng)避免在轉(zhuǎn)帳過程中任意移 動(dòng)小數(shù)點(diǎn)。 隔離性由并發(fā)事務(wù)所作的修改
4、必須與任何其它并發(fā)事務(wù)所作的修改隔離。事務(wù)查看數(shù)據(jù)時(shí)數(shù)據(jù)所處的 狀態(tài),要么是另一并發(fā)事務(wù)修改它之前的狀態(tài),要么是另一事務(wù)修改它之后的狀態(tài),事務(wù)不會(huì)查看 中間狀態(tài)的數(shù)據(jù)。這稱為可串行性,因?yàn)樗軌蛑匦卵b載起始數(shù)據(jù),并且重播一系列事務(wù),以使數(shù) 據(jù)結(jié)束時(shí)的狀態(tài)與原始事務(wù)執(zhí)行的狀態(tài)相同。當(dāng)事務(wù)可序列化時(shí)將獲得最高的隔離級(jí)別。在此級(jí)別 上,從一組可并行執(zhí)行的事務(wù)獲得的結(jié)果與通過連續(xù)運(yùn)行每個(gè)事務(wù)所獲得的結(jié)果相同。由于高度隔 離會(huì)限制可并行執(zhí)行的事務(wù)數(shù),所以一些應(yīng)用程序降低隔離級(jí)別以換取更大的吞吐量。 持久性事務(wù)完成之后,它對(duì)于系統(tǒng)的影響是永久性的。該修改即使出現(xiàn)致命的系統(tǒng)故障也將一直保持。DBMS的責(zé)任和
5、我們的任務(wù)企業(yè)級(jí)的數(shù)據(jù)庫管理系統(tǒng)(DBMS )都有責(zé)任提供一種保證事務(wù)的物理完整性的機(jī)制。就常用的SQL Server2000系統(tǒng)而言,它具備鎖定設(shè)備隔離事務(wù)、記錄設(shè)備保證事務(wù)持久性等機(jī)制。因此,我們不必關(guān)心數(shù)據(jù)庫事務(wù)的物理完整性,而應(yīng)該關(guān)注在什么情況下使用數(shù)據(jù)庫事務(wù)、事務(wù)對(duì)性能的 影響,如何使用事務(wù)等等。本文將涉及到在.net框架下使用 C#語言操縱數(shù)據(jù)庫事務(wù)的各個(gè)方面。體3金SQL語言的事務(wù)機(jī)制作為大型的企業(yè)級(jí)數(shù)據(jù)庫,SQL Server2000對(duì)事務(wù)提供了很好的支持。我們可以使用SQL語句來定義、提交以及回滾一個(gè)事務(wù)。如下所示的 SQL代碼定義了一個(gè)事務(wù),并且命名為"MyTra
6、nsaction"(限于篇幅,本文并不討論如何編寫 SQL語言程序,請(qǐng)讀者自行參考相關(guān)書籍):DECLARE TranName VARCHAR(20)SELECT TranName = 'MyTransaction'BEGIN TRANSACTION TranNameGOUSE pubs GOUPDATE royschedSET royalty = royalty * 1.10WHERE title_id LIKE 'Pc%' GOCOMMIT TRANSACTION MyTransactionGO這里用到了 SQL Server2000 自帶的示例數(shù)
7、據(jù)庫 pubs ,提交事務(wù)后,將為所有暢銷計(jì)算機(jī)書籍 支付的版稅增加10%。打開SQL Server2000的查詢分析器,選擇 pubs數(shù)據(jù)庫,然后運(yùn)行這段程序,結(jié)果顯而易見??墒侨绾卧?C#程序中運(yùn)行呢?我們記得在普通的SQL查詢中,一般需要把查詢語句賦值給SalCommand.CommandText 屬性,這里也就像普通的SQL查詢語句一樣,將這些語句賦給SqlCommand.CommandText屬性即可。要注意的一點(diǎn)是,其中的 "GO"語句標(biāo)志著 SQL批處理的結(jié)束,編寫SQL腳本是需要的, 但是在這里是不必要的。我們可以編寫如下的程序來驗(yàn)證這個(gè)想法:/TranSq
8、l.csusing System;using System.Data;using System.Data.SqlClient;namespace Aspcnpublic class DbTranSqlfile:/將事務(wù)放到 SQL Server 中執(zhí)行public void DoTran() ( file:/建立連接并打開SqlConnection myConn=GetConn();myConn.Open();SqlCommand myComm=new SqlCommand(); try (myComm.Connection=myConn;myComm.CommandText="DE
9、CLARE TranName VARCHAR(20)" myComm.CommandText+="SELECT TranName = 'MyTransaction'" myComm.CommandText+="BEGIN TRANSACTION TranName " myComm.CommandText+="USE pubs "myComm.CommandText+="UPDATE roysched SET royalty = royalty * 1.10 WHERE title_id LIKE &
10、#39;Pc%' "myComm.CommandText+="COMMIT TRANSACTION MyTransaction " myComm.ExecuteNonQuery(); catch(Exception err) (throw new ApplicationException(" 事務(wù)操作出錯(cuò),系統(tǒng)信息:"+err.Message); finally (myConn.Close(); file:/獲取數(shù)據(jù)連接 private SqlConnection GetConn()(string strSql="Data S
11、ource=localhost;Integrated Security=SSPI;user id=sa;password=" SqlConnection myConn=new SqlConnection(strSql);return myConn; public class Test (public static void Main()(DbTranSql tranTest=new DbTranSql();tranTest.DoTran();Console.WriteLine("事務(wù)處理已經(jīng)成功完成。");Console.ReadLine();注意到其中的 Sql
12、Command 對(duì)象 myComm ,它的CommandText 屬性僅僅是前面SQL代碼字符串連接起來即可,當(dāng)然,其中的 "GO"語句已經(jīng)全部去掉了。這個(gè)語句就像普通的查詢一樣,程序 將SQL文本事實(shí)上提交給DBMS去處理了,然后接收返回的結(jié)果(如果有結(jié)果返回的話)。很自然,我們最后看到了輸出"事務(wù)處理已經(jīng)成功完成",再用企業(yè)管理器查看pubs數(shù)據(jù)庫的roysched 表,所有title_id字段以"PC”開頭的書籍的 royalty字段的值都增加了0.1倍。這里,我們并沒有使用ADO.net的事務(wù)處理機(jī)制,而是簡(jiǎn)單地將執(zhí)行事務(wù)的SQL語句當(dāng)
13、作普通的查詢來執(zhí)行,因此,事實(shí)上該事務(wù)完全沒有用到.net的相關(guān)特性。了解.net中的事務(wù)機(jī)制如你所知,在.net框架中主要有兩個(gè)命名空間(namespace)用于應(yīng)用程序同數(shù)據(jù)庫系統(tǒng)的交互:System.Data.SqlClient 和 System.Data.OleDb 。前者專門用于連接Microsoft 公司自己的 SQLServer數(shù)據(jù)庫,而后者可以適應(yīng)多種不同的數(shù)據(jù)庫。這兩個(gè)命名空間中都包含有專門用于管理數(shù)據(jù) 庫事務(wù)的類,分別是 System.Data.SqlClient.SqlTranscation 類和 System.Data.OleDb.OleDbTranscation 類。
14、就像它們的名字一樣,這兩個(gè)類大部分功能是一樣的,二者之間的主要差別在于它們的連接機(jī)制,前者提供一組直接調(diào)用SQL Server的對(duì)象,而后者使用本機(jī)OLE DB 啟用數(shù)據(jù)訪問。事實(shí)上,ADO.net 事務(wù)完全在數(shù)據(jù)庫的內(nèi)部處理,且不受 Microsoft 分布式事務(wù)處理協(xié)調(diào)器(DTC)或任何其他事務(wù)性機(jī)制的支持。本文將主要介紹System.Data.SqlClient.SqlTranscation 類,下面的段落中,除了特別注明,都將使用System.Data.SqlClient.SqlTranscation 類。事務(wù)的開啟和提交現(xiàn)在我們對(duì)事務(wù)的概念和原理都了然于心了,并且作為已經(jīng)有一些基礎(chǔ)的
15、C#開發(fā)者,我們已經(jīng)熟知編寫數(shù)據(jù)庫交互程序的一些要點(diǎn),即使用SqlConnection 類的對(duì)象的 Open()方法建立與數(shù)據(jù)庫服務(wù)器的連接,然后將該連接賦給SqlCommand 對(duì)象的Connection 屬性,將欲執(zhí)行的 SQL語句賦給它的CommandText 屬性,于是就可以通過SqlCommand對(duì)象進(jìn)行數(shù)據(jù)庫操作了。對(duì)于我們將要編寫的事務(wù)處理程序,當(dāng)然還需要定義一個(gè)SqlTransaction類型的對(duì)象。并且看到SqlCommand對(duì)象的Transcation 屬性,我們很容易想到新建的SqlTransaction對(duì)象應(yīng)該與它關(guān)聯(lián)起來?;谝陨险J(rèn)識(shí),下面我們就開始動(dòng)手寫我們的第一個(gè)
16、事務(wù)處理程序。我們可以很熟練地寫出下 面這一段程序:/DoTran.csusing System;using System.Data;using System.Data.SqlClient;namespace Aspcn( public class DbTran ( file:/執(zhí)行事務(wù)處理 public void DoTran() ( file:/建立連接并打開 SqlConnection myConn=GetConn(); myConn.Open();SqlCommand myComm=new SqlCommand();SqlTransaction myTran=new SqlTransa
17、ction(); try ( myComm.Connection=myConn;myComm.Transaction=myTran; file:/定位到pubs數(shù)據(jù)庫 myComm.CommandText="USE pubs" myComm.ExecuteNonQuery();file:/更新數(shù)據(jù)file:/將所有的計(jì)算機(jī)類圖書myComm.CommandText="UPDATE roysched SET royalty = royalty * 1.10 WHERE title_id LIKE 'Pc%'"myComm.ExecuteNo
18、nQuery();/提交事務(wù)myTran.Commit(); catch(Exception err) ( throw new ApplicationException("事務(wù)操作出錯(cuò),系統(tǒng)信息: "+err.Message); finally ( myConn.Close(); file:/獲取數(shù)據(jù)連接 private SqlConnection GetConn() (string strSql="Data Source=localhost;Integrated Security=SSPI;user id=sa;password="SqlConnect
19、ion myConn=new SqlConnection(strSql); return myConn;) ) public class Testpublic static void Main() (DbTran tranTest=new DbTran();tranTest.DoTran();Console.WriteLine("事務(wù)處理已經(jīng)成功完成。");Console.ReadLine();) ) )顯然,這個(gè)程序非常簡(jiǎn)單,我們非常自信地編譯它,但是,出乎意料的結(jié)果使我們的成就感頓 時(shí)煙消云散:error CS1501: 重載"SqlTransaction&q
20、uot; 方法未獲取 "0"參數(shù) 是什么原因呢?注意到我們初始化的代碼:SqlTransaction myTran=new SqlTransaction();顯然,問題出在這里,事實(shí)上,SqlTransaction類并沒有公共的構(gòu)造函數(shù),我們不能這樣新建一個(gè)SqlTrancaction 類型的變量。在事務(wù)處理之前確實(shí)需要有一個(gè)SqlTransaction 類型的變量,將該變量關(guān)聯(lián)到SqlCommand 類的Transcation屬性也是必要的,但是初始化方法卻比較特別一點(diǎn)。在初始化 SqlTransaction 類時(shí),你需要使用SqlConnection 類的 BeginT
21、ranscation() 方法:SqlTransaction myTran; myTran=myConn.BeginTransaction();該方法返回一個(gè)SqlTransaction 類型的變量。在調(diào)用 BeginTransaction() 方法以后,所有基于該數(shù)據(jù)連接對(duì)象的SQL語句執(zhí)行動(dòng)作都將被認(rèn)為是事務(wù)MyTran的一部分。同時(shí),你也可以在該方法的參數(shù)中指定事務(wù)隔離級(jí)別和事務(wù)名稱,如:SqlTransaction myTran;myTran=myConn.BeginTransaction(IsolationLevel.ReadCommitted,"SampleTransac
22、tion");關(guān)于隔離級(jí)別的概念我們將在隨后的內(nèi)容中探討,在這里我們只需牢記一個(gè)事務(wù)是如何被啟動(dòng),并且關(guān)聯(lián)到特定的數(shù)據(jù)鏈接的。先不要急著去搞懂我們的事務(wù)都干了些什么,看到這一行: myTran.Commit();是的,這就是事務(wù)的提交方式。該語句執(zhí)行后,事務(wù)的所有數(shù)據(jù)庫操作將生效,并且為數(shù)據(jù)庫 事務(wù)的持久性機(jī)制所保持-即使系統(tǒng)在這以后發(fā)生致命錯(cuò)誤,該事務(wù)對(duì)數(shù)據(jù)庫的影響也不會(huì)消失。對(duì)上面的程序做了修改之后我們可以得到如下代碼(為了節(jié)約篇幅,重復(fù)之處已省略,請(qǐng)參照 前文):/DoTran.cs file:/執(zhí)行事務(wù)處理public void DoTran()(file:/建立連接并打開SqlConnection myConn=GetCo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 課題申報(bào)參考:教育數(shù)字化轉(zhuǎn)型下高校輔導(dǎo)員數(shù)字素養(yǎng)測(cè)評(píng)及提升路徑研究
- 2025年度個(gè)人商鋪長(zhǎng)期租賃合同標(biāo)的物詳細(xì)清單3篇
- 二零二五年度出租房屋消防安全設(shè)施改造施工合同4篇
- 二零二五年度假離婚法律風(fēng)險(xiǎn)評(píng)估及解決方案合同3篇
- 2025年度無人機(jī)租賃合同協(xié)議書8篇
- 2025版木工預(yù)制構(gòu)件生產(chǎn)與安裝合同范本4篇
- 個(gè)人合同擔(dān)保書(2024年樣本):教育貸款擔(dān)保2篇
- 2025年個(gè)人挖機(jī)租賃合同續(xù)簽協(xié)議4篇
- 2025年度個(gè)人委托醫(yī)療健康產(chǎn)業(yè)投資管理協(xié)議2篇
- 2025年門窗行業(yè)產(chǎn)業(yè)扶貧合作協(xié)議3篇
- 2025水利云播五大員考試題庫(含答案)
- 老年髖部骨折患者圍術(shù)期下肢深靜脈血栓基礎(chǔ)預(yù)防專家共識(shí)(2024版)解讀
- 中藥飲片驗(yàn)收培訓(xùn)
- 手術(shù)室專科護(hù)士工作總結(jié)匯報(bào)
- DB34T 1831-2013 油菜收獲與秸稈粉碎機(jī)械化聯(lián)合作業(yè)技術(shù)規(guī)范
- 創(chuàng)傷處理理論知識(shí)考核試題及答案
- 肝素誘導(dǎo)的血小板減少癥培訓(xùn)課件
- 抖音認(rèn)證承諾函
- 高等數(shù)學(xué)(第二版)
- 四合一體系基礎(chǔ)知識(shí)培訓(xùn)課件
- ICD-9-CM-3手術(shù)與操作國家臨床版亞目表
評(píng)論
0/150
提交評(píng)論