筆者對(duì)ADO.Net Sql進(jìn)行使用說(shuō)明
原來(lái)上網(wǎng)我下了很多ADO.Net Sql的Demo。而我用的是ADO.Net Sql,我在使用這些小樣時(shí),基本上絕大部分基于ADO.Net Sql工程都因?yàn)樯贁?shù)文件無(wú)法轉(zhuǎn)換而無(wú)法加載工程,為此我也苦惱很久,后來(lái)終于讓我找到了解決辦法。
System.Data.SqlClient namespace包括了SqlTransaction類(lèi)。此類(lèi)包括了兩個(gè)屬性:
◆Connection:指示同事務(wù)處理相關(guān)聯(lián)的SqlConnection對(duì)象;
◆IsolationLevel:定義事務(wù)處理的ADO.Net Sql。
屬性IsolationLevel是包括如下成員的枚舉對(duì)象:
◆Chaos:從高度獨(dú)立的事務(wù)處理中出現(xiàn)的pending changes不能被覆蓋;
◆ReadCommitted:當(dāng)數(shù)據(jù)需要被非惡意讀取時(shí),采用共享鎖定(shared locks),但數(shù)據(jù)仍然可以在事務(wù)處理結(jié)束時(shí)被更新,這造成了非重復(fù)性的數(shù)據(jù)讀取(nonrepeatable reads)或phantom data的產(chǎn)生;#t#
◆ReadUncommitted:惡意讀取數(shù)據(jù)是可能發(fā)生的,這表示沒(méi)有使用共享鎖定(shared locks),并且沒(méi)有實(shí)現(xiàn)獨(dú)占鎖定(exclusive locks);
◆ADO.Net Sql:鎖定查詢(xún)中所用到的所有數(shù)據(jù),由此避免其他用戶(hù)對(duì)數(shù)據(jù)進(jìn)行更新。在phantom rows仍然可用的狀態(tài)下,這可以避免非重復(fù)性的數(shù)據(jù)讀?。╪onrepeatable reads);
◆Serialisable:在DataSet中進(jìn)行范圍鎖定,由此防止其他用戶(hù)在事務(wù)處理結(jié)束之前更新數(shù)據(jù)或在數(shù)據(jù)庫(kù)中插入行;
◆IsolationLevel定義鎖定記錄的級(jí)別,但這一概念不在本文論述范圍之內(nèi)。對(duì)象SqlTransaction也提供了類(lèi)似的方法。你可以使用以下方法來(lái)進(jìn)行事務(wù)處理;
◆Commit:提交數(shù)據(jù)庫(kù)事務(wù)處理;
◆ADO.Net Sql:從未決狀態(tài)(pending state)反轉(zhuǎn)(roll back)事務(wù)處理。事務(wù)處理一旦被提交后即不能執(zhí)行此操作;
◆Save:在事務(wù)處理中創(chuàng)建savepoint可以對(duì)事務(wù)處理的一部分進(jìn)行反轉(zhuǎn),并且指定savepoint名稱(chēng)。
創(chuàng)建一個(gè)ADO.NET事務(wù)是很簡(jiǎn)單的,僅僅是標(biāo)準(zhǔn)代碼的一個(gè)小的擴(kuò)展。只要你知道如何使用ADO.NET來(lái)訪問(wèn)數(shù)據(jù)庫(kù),那就差不多知道了。區(qū)別僅僅是你需要把代碼放到一個(gè)事務(wù)上下文中。
還是原來(lái)的ADO.Net Sql類(lèi)庫(kù)引用,在實(shí)現(xiàn)事務(wù)的類(lèi)裏面引入System.Data和System.Data.SqlClient類(lèi)庫(kù),為了執(zhí)行一個(gè)事 務(wù),你需要?jiǎng)?chuàng)建一個(gè)SqlTransation對(duì)象,可以調(diào)用你的SqlConnection對(duì)象BeginTransation()方法來(lái)創(chuàng)建它,一旦 你把SqlTransation對(duì)象存為本地變數(shù),你就可以把它賦給你的SqlCommand對(duì)象的事務(wù)屬性,或者把它作為構(gòu)造器的一個(gè)參數(shù)來(lái)創(chuàng)建 SqlCommand。在執(zhí)行SqlCommand動(dòng)作之前,你必須調(diào)用BeginTransaction()方法,然後賦給SqlCommand事務(wù)屬 性。