📄 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> ⑴</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> ⑷</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 + -