?? 045.htm
字號:
<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><fontface="Arial">Delphi</font><font face="宋體" lang="ZH-CN">為</font><font face="Arial">DataSet</font><fontface="宋體" lang="ZH-CN">中的寫每個記錄進行隱式事務控制。它提交每一個獨立的寫操作,如</font><fontface="Arial">Post</font><font face="宋體" lang="ZH-CN">和</font><font face="Arial">AppendRecord</font><font face="宋體" lang="ZH-CN">。</p><p> 使用隱式事務控制是容易的,它保證最小的記錄更新沖突和數據庫的一致性視圖。另一方面,因為寫入數據庫的數據的每一行都要進行事務控制,</font><fontface="Arial"> </font><font face="宋體" lang="ZH-CN">所以隱式事務控制將導致網絡過忙和應用程序性能下降。</p><p> 如果采用顯式事務控制,就能選擇最有效的時機來開始、提交和終止事務,特別是在開發多用戶環境下的客戶應用程序運行訪問遠程</font><fontface="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><fontface="宋體" lang="ZH-CN">數據庫應用的事務控制:</p><p> ●</font><font face="Arial"> </font><font face="宋體" lang="ZH-CN">使用</font><fontface="Arial">TDatabase</font><font face="宋體" lang="ZH-CN">部件的方法和屬性</p><p> ●</font><font face="Arial"> </font><font face="宋體" lang="ZH-CN">使用</font><fontface="Arial">TQuery</font><font face="宋體" lang="ZH-CN">部件中的傳遞式</font><fontface="Arial">SQL</font><font face="宋體" lang="ZH-CN">。這種方式只有在</font><fontface="Arial">Delphi Client/Server Suite</font><font face="宋體" lang="ZH-CN">版中才有效,</font><fontface="Arial">SQL Links</font><font face="宋體" lang="ZH-CN">將</font><font face="Arial">SQL</font><fontface="宋體" lang="ZH-CN">表達式直接傳給過程</font><font face="Arial">SQL</font><fontface="宋體" 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><fontface="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><fontface="宋體" lang="ZH-CN">用于事務顯式控制的方法表</font><font face="Arial"></p><p></font><font face="宋體" lang="ZH-CN"> </font><font face="Arial"> </font><fontface="宋體" lang="ZH-CN">━━━━━━━━━━━━━━━━━━━━━━━━</font><fontface="Arial"></p><p></font><font face="宋體" lang="ZH-CN"> </font><font face="Arial"> </font><fontface="宋體" lang="ZH-CN"> 方法或屬性 </font><font face="Arial"> </font><fontface="宋體" 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><fontface="宋體" lang="ZH-CN">────────────────────────</font><fontface="Arial"></p><p></font><font face="宋體" lang="ZH-CN"> </font><font face="Arial">Commit </font><fontface="宋體" lang="ZH-CN">提交數據的修改并終止事務</font><font face="Arial"></p><p></font><font face="宋體" lang="ZH-CN"> </font><font face="Arial">Rollback </font><fontface="宋體" 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><fontface="宋體" lang="ZH-CN">表述事務的獨立性級別</font><font face="Arial"></p><p></font><font face="宋體" lang="ZH-CN"> </font><font face="Arial"> </font><fontface="宋體" lang="ZH-CN">━━━━━━━━━━━━━━━━━━━━━━━━</p><p> </p><p> </font><font face="Arial">StartTransaction</font><font face="宋體" lang="ZH-CN">,</font><fontface="Arial">Commit</font><font face="宋體" lang="ZH-CN">和</font><font face="Arial">Rollback</font><fontface="宋體" lang="ZH-CN">是供應用程序在運行時調用開始事務,控制事務并且保存或放棄所做數據修改的方法。</p><p> </font><font face="Arial">TransIsolation</font><font face="宋體" lang="ZH-CN">是</font><fontface="Arial">TDatabase</font><font face="宋體" lang="ZH-CN">部件的用于控制作用于相同表的不同事務之間如何交互的屬性。</p><p> ⑴</font><font face="Arial"> </font><font face="宋體" lang="ZH-CN">開始一個事務</p><p> 當你開始一個事務時,后來的所有讀寫數據庫的表達式都發生在那次事務的環境中。每個表達式都是其中一部分。任何表達式所做的修改,要么成功地提交給數據庫,要么每一個修改都被取消。考慮一個在</font><fontface="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><fontface="宋體" lang="ZH-CN">部件中的</font><font face="Arial">StartTransaction</font><fontface="宋體" 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><fontface="Arial">Commit</font><font face="宋體" lang="ZH-CN">或</font><font face="Arial">Rollback</font><fontface="宋體" 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><fontface="宋體" lang="ZH-CN">部件的</font><font face="Arial">Commit</font><fontface="宋體" 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><fontface="Arial">try</font><font face="宋體" lang="ZH-CN">…</font><font face="Arial">except</font><fontface="宋體" lang="ZH-CN">表達式中。如果一個事務不能成功提交,你就能處理錯誤,并重試操作。</p><p> ⑶</font><font face="Arial"> </font><font face="宋體" lang="ZH-CN">返轉一個事務</p><p> 為了取消數據庫修改,必須用</font><font face="Arial">Rollback</font><fontface="宋體" lang="ZH-CN">方法返轉一個事務。</font><font face="Arial">Rollback </font><fontface="宋體" lang="ZH-CN">復原一個事務的修改,并終止事務,例如:下列表達式將返轉一個事務:</font><fontface="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><fontface="Arial"></p><p></font><font face="宋體" lang="ZH-CN"> ●</font><font face="Arial"> </font><fontface="宋體" lang="ZH-CN">按鈕或菜單事件代碼,如用戶點按了</font><fontface="Arial">Cancel</font><font face="宋體" lang="ZH-CN">按鈕</p><p> </p><p> ⑷</font><font face="Arial"> </font><font face="宋體" lang="ZH-CN">使用</font><fontface="Arial">TransIsolation</font><font face="宋體" lang="ZH-CN">屬性</p><p> </font><font face="Arial">TransIsolation</font><font face="宋體" lang="ZH-CN">屬性描述</font><fontface="Arial">TDatabase</font><font face="宋體" lang="ZH-CN">部件事務的獨立級別,事務的獨立級別決定了事務與其它作用于相同表的事務是如何相互作用的。在改變或設置</font><fontface="Arial">TransIsolation </font><font face="宋體" lang="ZH-CN">的值之前,應當相當熟悉</font><fontface="Arial">Delphi</font><font face="宋體" lang="ZH-CN">中的事務和事務管理。</p><p> </font><font face="Arial">TransIsolation</font><font face="宋體" lang="ZH-CN">的缺省值是</font><fontface="Arial">tiReadCommitted</font><font face="宋體" lang="ZH-CN">。下表中總結了</font><fontface="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.12TransIsolation</font><font face="宋體" lang="ZH-CN">屬性值的含義</font><fontface="Arial"></p><p></font><font face="宋體" lang="ZH-CN"> ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</p><p> </font><font face="Arial"> </font><font face="宋體" lang="ZH-CN"> 獨立級別 </font><fontface="Arial"> </font><font face="宋體" lang="ZH-CN"> 含</font><fontface="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><fontface="宋體" lang="ZH-CN">修改不是永久性的,可能在任何時候被復原。</font><fontface="Arial"> </font><font face="宋體" lang="ZH-CN">在這個級別你</p><p> </font><font face="Arial"> </font><fontface="宋體" lang="ZH-CN">的事務與其它事務所做的修改具有最低獨立度。</p><p> </font><font face="Arial">tiReadCommitted </font><font face="宋體" lang="ZH-CN">只允許讀由其它同時事務提交的數據庫修改。這是缺省的獨</p><p> </font><font face="Arial"> </font><fontface="宋體" lang="ZH-CN">立級別。</p><p> </font><font face="Arial">tiRepeatableRead </font><font face="宋體"lang="ZH-CN">允許單個的數據庫讀事務無法看見其它同時事務對相同數據做</font><fontface="Arial"> </p><p></font><font face="宋體" lang="ZH-CN">的修改。這個獨立級別保證了你的事務一次讀一個記錄,記錄</font><fontface="Arial"></p><p></font><font face="宋體" lang="ZH-CN">的視圖不會改變,</font><fontface="Arial"> </font><font face="宋體" lang="ZH-CN">在這個級別你的事務與其它事務做的修改完</font><fontface="Arial"></p><p></font><font face="宋體" lang="ZH-CN">全獨立。</font><font face="Arial"></p><p></font><font face="宋體" lang="ZH-CN"> ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</p><p> </p><p> 各種數據庫服務器不同程度地支持這些獨立級別,有的根本不支持。</font><fontface="Arial"> </font><font face="宋體" lang="ZH-CN">如果請求的隔離級別不被服務器支持,</font><fontface="Arial">Delphi</font><font face="宋體" lang="ZH-CN">將采用更高的獨立級別。各種服務器支持的獨立級別請參見表</font><fontface="Arial">18.10</font><font face="宋體" lang="ZH-CN">。</font><font face="Arial"></p><p></font><font face="宋體" lang="ZH-CN">如果應用程序使用</font><fontface="Arial">ODBC</font><font face="宋體" lang="ZH-CN">與服務器交互,</font><fontface="Arial">ODBC</font><font face="宋體" lang="ZH-CN">驅動程序必須支持
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -