?? 045.htm
字號:
<p> 例如:一個應用程序可能更新</font><font face="Arial">ORDERS</font><font
face="宋體" lang="ZH-CN">表以指明接受購買某一項目的定單,那么也要更新</font><font
face="Arial">INNENTORY</font><font face="宋體" lang="ZH-CN">表以反映庫存的減少。如果在第一個更新之后,第二個更新之前發生硬件錯誤,數據庫就會處于不一致狀態,因為庫存情況沒有反映定單情況。在事務控制下,兩個表達式將在同一時間提交,如果其中一個表達式失敗,則被返轉</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">為應用程序提供隱式事務控制。當應用程序處于隱式事務控制時</font><font
face="Arial">Delphi</font><font face="宋體" lang="ZH-CN">為</font><font face="Arial">DataSet</font><font
face="宋體" lang="ZH-CN">中的寫每個記錄進行隱式事務控制。它提交每一個獨立的寫操作,如</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> 使用隱式事務控制是容易的,它保證最小的記錄更新沖突和數據庫的一致性視圖。另一方面,因為寫入數據庫的數據的每一行都要進行事務控制,</font><font
face="Arial"> </font><font face="宋體" lang="ZH-CN">所以隱式事務控制將導致網絡過忙和應用程序性能下降。</p>
<p> 如果采用顯式事務控制,就能選擇最有效的時機來開始、提交和終止事務,特別是在開發多用戶環境下的客戶應用程序運行訪問遠程</font><font
face="Arial">SQL</font><font face="宋體" lang="ZH-CN">服務器,就更應該采用顯式控制。</p>
<p> </font><font face="Arial"></p>
<p>18.3.2.3 </font><font face="宋體" lang="ZH-CN">使用顯式事務控制</p>
<p> </p>
<p> 有兩種協作又獨立的方式可運用于</font><font face="Arial">Delphi</font><font
face="宋體" lang="ZH-CN">數據庫應用的事務控制:</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">表達式直接傳給過程</font><font face="Arial">SQL</font><font
face="宋體" lang="ZH-CN">或</font><font face="Arial">ODBC</font><font face="宋體"
lang="ZH-CN">服務器</p>
<p> </p>
<p> 使用</font><font face="Arial">TDatabase</font><font face="宋體" lang="ZH-CN">部件的方法和屬性的好處是提供了清晰的、輕便的、與特定數據庫或服務器無關的應用能力。</p>
<p> 使用傳遞式</font><font face="Arial">SQL</font><font face="宋體"
lang="ZH-CN">的主要好處在于可以運用特定服務器的先進事務管理能力。</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">部件中用于事務管理的方法和屬性以及它們的使用方法:</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">用于事務顯式控制的方法表</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"> 方法或屬性 </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">提交數據的修改并終止事務</font><font face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN"> </font><font face="Arial">Rollback </font><font
face="宋體" lang="ZH-CN">取消數據的修改并終止事務</font><font face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN"> </font><font face="Arial">StartTransaction
</font><font face="宋體" lang="ZH-CN">開始一個事務</font><font face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN"> </font><font face="Arial">TransIsolation </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">━━━━━━━━━━━━━━━━━━━━━━━━</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">是供應用程序在運行時調用開始事務,控制事務并且保存或放棄所做數據修改的方法。</p>
<p> </font><font face="Arial">TransIsolation</font><font face="宋體" lang="ZH-CN">是</font><font
face="Arial">TDatabase</font><font face="宋體" lang="ZH-CN">部件的用于控制作用于相同表的不同事務之間如何交互的屬性。</p>
<p> ?、?lt;/font><font face="Arial"> </font><font face="宋體" lang="ZH-CN">開始一個事務</p>
<p> 當你開始一個事務時,后來的所有讀寫數據庫的表達式都發生在那次事務的環境中。每個表達式都是其中一部分。任何表達式所做的修改,要么成功地提交給數據庫,要么每一個修改都被取消??紤]一個在</font><font
face="Arial">ATM</font><font face="宋體" lang="ZH-CN">上的銀行傳輸問題。當顧客決定將錢從存款帳戶轉到支付帳戶時,在銀行數據庫記錄上必須發生兩個修改:</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> 如果出于某種原因,其中的一個操作不能被完成,那么任何一個操作都不應該發生。因為這些操作是相關的,它們應該發生在同一個事務中。</p>
<p> 為了開始</font><font face="Arial">Delphi</font><font face="宋體"
lang="ZH-CN">應用程序中的一個事務,需要調用</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">此后的所有數據操作都發生在最近一個事務的環境中,直到該次事務通過調用</font><font
face="Arial">Commit</font><font face="宋體" lang="ZH-CN">或</font><font face="Arial">Rollback</font><font
face="宋體" lang="ZH-CN">顯式地終止為止。</p>
<p> 那么,應當將事務保持多久呢?理想狀態下,只要需要,多久都行。事務的活躍狀態越長,同時訪問數據庫的用戶越多,在你的事務的生命其中,更多的并發、同時的事務開始和終止,于是當試圖提交修改時,與其它事務沖突的可能性更大。</p>
<p> ⑵</font><font face="Arial"> </font><font face="宋體" lang="ZH-CN">提交一個事務</p>
<p> 為了做永久性修改,事務必須使用</font><font face="Arial">TDatabase</font><font
face="宋體" lang="ZH-CN">部件的</font><font face="Arial">Commit</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.Commit</p>
<p> </font><font face="宋體" lang="ZH-CN"></p>
<p> </font><font face="Arial">Commit</font><font face="宋體" lang="ZH-CN">的調用應當置于</font><font
face="Arial">try</font><font face="宋體" lang="ZH-CN">…</font><font face="Arial">except</font><font
face="宋體" lang="ZH-CN">表達式中。如果一個事務不能成功提交,你就能處理錯誤,并重試操作。</p>
<p> ⑶</font><font face="Arial"> </font><font face="宋體" lang="ZH-CN">返轉一個事務</p>
<p> 為了取消數據庫修改,必須用</font><font face="Arial">Rollback</font><font
face="宋體" lang="ZH-CN">方法返轉一個事務。</font><font face="Arial">Rollback </font><font
face="宋體" lang="ZH-CN">復原一個事務的修改,并終止事務,例如:下列表達式將返轉一個事務:</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">通常發生在:</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">按鈕或菜單事件代碼,如用戶點按了</font><font
face="Arial">Cancel</font><font face="宋體" lang="ZH-CN">按鈕</p>
<p> </p>
<p> ?、?lt;/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">部件事務的獨立級別,事務的獨立級別決定了事務與其它作用于相同表的事務是如何相互作用的。在改變或設置</font><font
face="Arial">TransIsolation </font><font face="宋體" lang="ZH-CN">的值之前,應當相當熟悉</font><font
face="Arial">Delphi</font><font face="宋體" lang="ZH-CN">中的事務和事務管理。</p>
<p> </font><font face="Arial">TransIsolation</font><font face="宋體" lang="ZH-CN">的缺省值是</font><font
face="Arial">tiReadCommitted</font><font face="宋體" lang="ZH-CN">。下表中總結了</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"> 獨立級別 </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">允許讀由其它同時事務寫入數據庫的未提交的修改。未提交的</p>
<p> </font><font face="Arial"> </font><font
face="宋體" lang="ZH-CN">修改不是永久性的,可能在任何時候被復原。</font><font
face="Arial"> </font><font face="宋體" lang="ZH-CN">在這個級別你</p>
<p> </font><font face="Arial"> </font><font
face="宋體" lang="ZH-CN">的事務與其它事務所做的修改具有最低獨立度。</p>
<p> </font><font face="Arial">tiReadCommitted </font><font face="宋體" lang="ZH-CN">只允許讀由其它同時事務提交的數據庫修改。這是缺省的獨</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">允許單個的數據庫讀事務無法看見其它同時事務對相同數據做</font><font
face="Arial"> </p>
<p></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><fo
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -