?? 045.htm
字號:
<p> 例如:一個(gè)應(yīng)用程序可能更新</font><font face="Arial">ORDERS</font><font
face="宋體" lang="ZH-CN">表以指明接受購買某一項(xiàng)目的定單,那么也要更新</font><font
face="Arial">INNENTORY</font><font face="宋體" lang="ZH-CN">表以反映庫存的減少。如果在第一個(gè)更新之后,第二個(gè)更新之前發(fā)生硬件錯誤,數(shù)據(jù)庫就會處于不一致狀態(tài),因?yàn)閹齑媲闆r沒有反映定單情況。在事務(wù)控制下,兩個(gè)表達(dá)式將在同一時(shí)間提交,如果其中一個(gè)表達(dá)式失敗,則被返轉(zhuǎn)</font><font
face="Arial">(Rolled Back)</font><font face="宋體" lang="ZH-CN">。</p>
<p> </font><font face="Arial"></p>
<p>18.3.2.2 </font><font face="宋體" lang="ZH-CN">使用隱式控制</p>
<p> </p>
<p> 在缺省情況下,</font><font face="Arial">Delphi</font><font face="宋體"
lang="ZH-CN">通過</font><font face="Arial">BDE</font><font face="宋體" lang="ZH-CN">為應(yīng)用程序提供隱式事務(wù)控制。當(dāng)應(yīng)用程序處于隱式事務(wù)控制時(shí)</font><font
face="Arial">Delphi</font><font face="宋體" lang="ZH-CN">為</font><font face="Arial">DataSet</font><font
face="宋體" lang="ZH-CN">中的寫每個(gè)記錄進(jìn)行隱式事務(wù)控制。它提交每一個(gè)獨(dú)立的寫操作,如</font><font
face="Arial">Post</font><font face="宋體" lang="ZH-CN">和</font><font face="Arial">Append
Record</font><font face="宋體" lang="ZH-CN">。</p>
<p> 使用隱式事務(wù)控制是容易的,它保證最小的記錄更新沖突和數(shù)據(jù)庫的一致性視圖。另一方面,因?yàn)閷懭霐?shù)據(jù)庫的數(shù)據(jù)的每一行都要進(jìn)行事務(wù)控制,</font><font
face="Arial"> </font><font face="宋體" lang="ZH-CN">所以隱式事務(wù)控制將導(dǎo)致網(wǎng)絡(luò)過忙和應(yīng)用程序性能下降。</p>
<p> 如果采用顯式事務(wù)控制,就能選擇最有效的時(shí)機(jī)來開始、提交和終止事務(wù),特別是在開發(fā)多用戶環(huán)境下的客戶應(yīng)用程序運(yùn)行訪問遠(yuǎn)程</font><font
face="Arial">SQL</font><font face="宋體" lang="ZH-CN">服務(wù)器,就更應(yīng)該采用顯式控制。</p>
<p> </font><font face="Arial"></p>
<p>18.3.2.3 </font><font face="宋體" lang="ZH-CN">使用顯式事務(wù)控制</p>
<p> </p>
<p> 有兩種協(xié)作又獨(dú)立的方式可運(yùn)用于</font><font face="Arial">Delphi</font><font
face="宋體" lang="ZH-CN">數(shù)據(jù)庫應(yīng)用的事務(wù)控制:</p>
<p> ●</font><font face="Arial"> </font><font face="宋體" lang="ZH-CN">使用</font><font
face="Arial">TDatabase</font><font face="宋體" lang="ZH-CN">部件的方法和屬性</p>
<p> ●</font><font face="Arial"> </font><font face="宋體" lang="ZH-CN">使用</font><font
face="Arial">TQuery</font><font face="宋體" lang="ZH-CN">部件中的傳遞式</font><font
face="Arial">SQL</font><font face="宋體" lang="ZH-CN">。這種方式只有在</font><font
face="Arial">Delphi Client/Server Suite</font><font face="宋體" lang="ZH-CN">版中才有效,</font><font
face="Arial">SQL Links</font><font face="宋體" lang="ZH-CN">將</font><font face="Arial">SQL</font><font
face="宋體" lang="ZH-CN">表達(dá)式直接傳給過程</font><font face="Arial">SQL</font><font
face="宋體" lang="ZH-CN">或</font><font face="Arial">ODBC</font><font face="宋體"
lang="ZH-CN">服務(wù)器</p>
<p> </p>
<p> 使用</font><font face="Arial">TDatabase</font><font face="宋體" lang="ZH-CN">部件的方法和屬性的好處是提供了清晰的、輕便的、與特定數(shù)據(jù)庫或服務(wù)器無關(guān)的應(yīng)用能力。</p>
<p> 使用傳遞式</font><font face="Arial">SQL</font><font face="宋體"
lang="ZH-CN">的主要好處在于可以運(yùn)用特定服務(wù)器的先進(jìn)事務(wù)管理能力。</p>
<p> </font><font face="Arial"> 1. </font><font face="宋體" lang="ZH-CN">使用</font><font
face="Arial">TDatabase</font><font face="宋體" lang="ZH-CN">的方法和屬性</p>
<p> 下表中列出了</font><font face="Arial">TDatabase</font><font face="宋體"
lang="ZH-CN">部件中用于事務(wù)管理的方法和屬性以及它們的使用方法:</p>
<p> </font><font face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN">表</font><font face="Arial">18.11 TDatabase</font><font
face="宋體" lang="ZH-CN">用于事務(wù)顯式控制的方法表</font><font face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN"> </font><font face="Arial"> </font><font
face="宋體" lang="ZH-CN">━━━━━━━━━━━━━━━━━━━━━━━━</font><font
face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN"> </font><font face="Arial"> </font><font
face="宋體" lang="ZH-CN"> 方法或?qū)傩浴 ?lt;/font><font face="Arial"> </font><font
face="宋體" lang="ZH-CN">作</font><font face="Arial"> </font><font face="宋體"
lang="ZH-CN">用</font><font face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN"> </font><font face="Arial"> </font><font
face="宋體" lang="ZH-CN">────────────────────────</font><font
face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN"> </font><font face="Arial">Commit </font><font
face="宋體" lang="ZH-CN">提交數(shù)據(jù)的修改并終止事務(wù)</font><font face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN"> </font><font face="Arial">Rollback </font><font
face="宋體" lang="ZH-CN">取消數(shù)據(jù)的修改并終止事務(wù)</font><font face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN"> </font><font face="Arial">StartTransaction
</font><font face="宋體" lang="ZH-CN">開始一個(gè)事務(wù)</font><font face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN"> </font><font face="Arial">TransIsolation </font><font
face="宋體" lang="ZH-CN">表述事務(wù)的獨(dú)立性級別</font><font face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN"> </font><font face="Arial"> </font><font
face="宋體" lang="ZH-CN">━━━━━━━━━━━━━━━━━━━━━━━━</p>
<p> </p>
<p> </font><font face="Arial">StartTransaction</font><font face="宋體" lang="ZH-CN">,</font><font
face="Arial">Commit</font><font face="宋體" lang="ZH-CN">和</font><font face="Arial">Rollback</font><font
face="宋體" lang="ZH-CN">是供應(yīng)用程序在運(yùn)行時(shí)調(diào)用開始事務(wù),控制事務(wù)并且保存或放棄所做數(shù)據(jù)修改的方法。</p>
<p> </font><font face="Arial">TransIsolation</font><font face="宋體" lang="ZH-CN">是</font><font
face="Arial">TDatabase</font><font face="宋體" lang="ZH-CN">部件的用于控制作用于相同表的不同事務(wù)之間如何交互的屬性。</p>
<p> ⑴</font><font face="Arial"> </font><font face="宋體" lang="ZH-CN">開始一個(gè)事務(wù)</p>
<p> 當(dāng)你開始一個(gè)事務(wù)時(shí),后來的所有讀寫數(shù)據(jù)庫的表達(dá)式都發(fā)生在那次事務(wù)的環(huán)境中。每個(gè)表達(dá)式都是其中一部分。任何表達(dá)式所做的修改,要么成功地提交給數(shù)據(jù)庫,要么每一個(gè)修改都被取消。考慮一個(gè)在</font><font
face="Arial">ATM</font><font face="宋體" lang="ZH-CN">上的銀行傳輸問題。當(dāng)顧客決定將錢從存款帳戶轉(zhuǎn)到支付帳戶時(shí),在銀行數(shù)據(jù)庫記錄上必須發(fā)生兩個(gè)修改:</p>
<p> ●</font><font face="Arial"> </font><font face="宋體" lang="ZH-CN">存款帳戶必須記入借方</p>
<p> ●</font><font face="Arial"> </font><font face="宋體" lang="ZH-CN">支付帳戶必須記入貸方</p>
<p> </p>
<p> 如果出于某種原因,其中的一個(gè)操作不能被完成,那么任何一個(gè)操作都不應(yīng)該發(fā)生。因?yàn)檫@些操作是相關(guān)的,它們應(yīng)該發(fā)生在同一個(gè)事務(wù)中。</p>
<p> 為了開始</font><font face="Arial">Delphi</font><font face="宋體"
lang="ZH-CN">應(yīng)用程序中的一個(gè)事務(wù),需要調(diào)用</font><font face="Arial">TDatabase</font><font
face="宋體" lang="ZH-CN">部件中的</font><font face="Arial">StartTransaction</font><font
face="宋體" lang="ZH-CN">方法:</p>
<p> </font><font face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN"> </font><font face="Arial">DatabaseInterBase.StartTransaction;</p>
<p> </p>
<p></font><font face="宋體" lang="ZH-CN">此后的所有數(shù)據(jù)操作都發(fā)生在最近一個(gè)事務(wù)的環(huán)境中,直到該次事務(wù)通過調(diào)用</font><font
face="Arial">Commit</font><font face="宋體" lang="ZH-CN">或</font><font face="Arial">Rollback</font><font
face="宋體" lang="ZH-CN">顯式地終止為止。</p>
<p> 那么,應(yīng)當(dāng)將事務(wù)保持多久呢?理想狀態(tài)下,只要需要,多久都行。事務(wù)的活躍狀態(tài)越長,同時(shí)訪問數(shù)據(jù)庫的用戶越多,在你的事務(wù)的生命其中,更多的并發(fā)、同時(shí)的事務(wù)開始和終止,于是當(dāng)試圖提交修改時(shí),與其它事務(wù)沖突的可能性更大。</p>
<p> ⑵</font><font face="Arial"> </font><font face="宋體" lang="ZH-CN">提交一個(gè)事務(wù)</p>
<p> 為了做永久性修改,事務(wù)必須使用</font><font face="Arial">TDatabase</font><font
face="宋體" lang="ZH-CN">部件的</font><font face="Arial">Commit</font><font
face="宋體" lang="ZH-CN">方法提交。執(zhí)行提交表達(dá)式將保存數(shù)據(jù)庫的修改并終止事務(wù)。例如,下列表達(dá)式將終止在上例中開始的事務(wù):</p>
<p> </font><font face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN"> </font><font face="Arial">DatabaseInterBase.Commit</p>
<p> </font><font face="宋體" lang="ZH-CN"></p>
<p> </font><font face="Arial">Commit</font><font face="宋體" lang="ZH-CN">的調(diào)用應(yīng)當(dāng)置于</font><font
face="Arial">try</font><font face="宋體" lang="ZH-CN">…</font><font face="Arial">except</font><font
face="宋體" lang="ZH-CN">表達(dá)式中。如果一個(gè)事務(wù)不能成功提交,你就能處理錯誤,并重試操作。</p>
<p> ⑶</font><font face="Arial"> </font><font face="宋體" lang="ZH-CN">返轉(zhuǎn)一個(gè)事務(wù)</p>
<p> 為了取消數(shù)據(jù)庫修改,必須用</font><font face="Arial">Rollback</font><font
face="宋體" lang="ZH-CN">方法返轉(zhuǎn)一個(gè)事務(wù)。</font><font face="Arial">Rollback </font><font
face="宋體" lang="ZH-CN">復(fù)原一個(gè)事務(wù)的修改,并終止事務(wù),例如:下列表達(dá)式將返轉(zhuǎn)一個(gè)事務(wù):</font><font
face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN"> </font><font face="Arial">DatabaseInterBase.Rollback;</p>
<p> </p>
<p>Rollback</font><font face="宋體" lang="ZH-CN">通常發(fā)生在:</p>
<p> ●</font><font face="Arial"> </font><font face="宋體" lang="ZH-CN">異常處理代碼</font><font
face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN"> ●</font><font face="Arial"> </font><font
face="宋體" lang="ZH-CN">按鈕或菜單事件代碼,如用戶點(diǎn)按了</font><font
face="Arial">Cancel</font><font face="宋體" lang="ZH-CN">按鈕</p>
<p> </p>
<p> ⑷</font><font face="Arial"> </font><font face="宋體" lang="ZH-CN">使用</font><font
face="Arial">TransIsolation</font><font face="宋體" lang="ZH-CN">屬性</p>
<p> </font><font face="Arial">TransIsolation</font><font face="宋體" lang="ZH-CN">屬性描述</font><font
face="Arial">TDatabase</font><font face="宋體" lang="ZH-CN">部件事務(wù)的獨(dú)立級別,事務(wù)的獨(dú)立級別決定了事務(wù)與其它作用于相同表的事務(wù)是如何相互作用的。在改變或設(shè)置</font><font
face="Arial">TransIsolation </font><font face="宋體" lang="ZH-CN">的值之前,應(yīng)當(dāng)相當(dāng)熟悉</font><font
face="Arial">Delphi</font><font face="宋體" lang="ZH-CN">中的事務(wù)和事務(wù)管理。</p>
<p> </font><font face="Arial">TransIsolation</font><font face="宋體" lang="ZH-CN">的缺省值是</font><font
face="Arial">tiReadCommitted</font><font face="宋體" lang="ZH-CN">。下表中總結(jié)了</font><font
face="Arial">TransIsolation</font><font face="宋體" lang="ZH-CN">的可能值并描述了它們的含義:</p>
<p> </font><font face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN">表</font><font face="Arial">18.12
TransIsolation</font><font face="宋體" lang="ZH-CN">屬性值的含義</font><font
face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN"> ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</p>
<p> </font><font face="Arial"> </font><font face="宋體" lang="ZH-CN"> 獨(dú)立級別 </font><font
face="Arial"> </font><font face="宋體" lang="ZH-CN"> 含</font><font
face="Arial"> </font><font face="宋體" lang="ZH-CN">義</font><font face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN">──────────────────────────────────────</p>
<p> </font><font face="Arial"> tiDirtyRead </font><font face="宋體" lang="ZH-CN">允許讀由其它同時(shí)事務(wù)寫入數(shù)據(jù)庫的未提交的修改。未提交的</p>
<p> </font><font face="Arial"> </font><font
face="宋體" lang="ZH-CN">修改不是永久性的,可能在任何時(shí)候被復(fù)原。</font><font
face="Arial"> </font><font face="宋體" lang="ZH-CN">在這個(gè)級別你</p>
<p> </font><font face="Arial"> </font><font
face="宋體" lang="ZH-CN">的事務(wù)與其它事務(wù)所做的修改具有最低獨(dú)立度。</p>
<p> </font><font face="Arial">tiReadCommitted </font><font face="宋體" lang="ZH-CN">只允許讀由其它同時(shí)事務(wù)提交的數(shù)據(jù)庫修改。這是缺省的獨(dú)</p>
<p> </font><font face="Arial"> </font><font
face="宋體" lang="ZH-CN">立級別。</p>
<p> </font><font face="Arial">tiRepeatableRead </font><font face="宋體"
lang="ZH-CN">允許單個(gè)的數(shù)據(jù)庫讀事務(wù)無法看見其它同時(shí)事務(wù)對相同數(shù)據(jù)做</font><font
face="Arial"> </p>
<p></font><font face="宋體" lang="ZH-CN">的修改。這個(gè)獨(dú)立級別保證了你的事務(wù)一次讀一個(gè)記錄,記錄</font><font
face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN">的視圖不會改變,</font><font
face="Arial"> </font><font face="宋體" lang="ZH-CN">在這個(gè)級別你的事務(wù)與其它事務(wù)做的修改完</font><font
face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN">全獨(dú)立。</font><fo
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -