关于PB开发中的commit

来源:互联网 发布:js怎么删除style属性 编辑:程序博客网 时间:2024/06/18 14:24
最近在给一个客户做一个PB项目,客户反映更新后速度大大降低。补充一下,客户采用的是PB的C/S架构,一个数据中心,多个使用站点。

    新开发的内容没有更新数据库,怎么会影响速度呢。唯一影响速度的只可能是锁表,顺着这条思路,我逐步跟踪了代码并使用sql server profiler对数据库进行了跟踪。跟踪发现当执行了我做的模块后PB界面上保留了信息。可是执行查询那张表却一直在查询中。当我关闭了该页面后查询结果立即出现了。

     问题很明了了,数据库中事务没有提交。当一个站点停留在改模块时,该事务一直没有提交,那张数据表也一直占用着,其他的站点当时打不开,甚至死机了。于是我在相应位置加上了commit,问题立即解决了。

     问题解决了,该总结一下了:为什么以前的sql 语句没加commit可以执行了呢?

     先看一下PowerBuiler和SQl Server使用的原理:PowerBuilder一般是通过数据窗口(Datawindow)来产生SQL Statement(例如:Insert、Update或Delete)或调用存储过程(Stored Procedure)并提交给SQL Server进行事务(Transaction)处理,同时PowerBuilder也可直接运用植入的(Embedded) SQL语句、调用(Call) Stored Procedure或动态的(Dynamic) SQL来完成Transaction处理。不论是PowerBuilder通过Datawindow产生SQL Statement或调用Stored Procedure,还是直接运用Embedded SQL、 Stored Procedure或Dynamic SQL等,系统都是将单一或一组的SQL Statement提交给SQL Server来运作。

     SQL Server接收SQL Statement后,假设被接收SQL Statement对一个表运作,但其运作也可能启动表中的触发器(Trigger)并且此Trigger也可能会对其它表产生运作、或启动数个Stored Procedure或其它Trigger。SQL Server处理完接收的SQL Statement后会返回结果给PowerBuilder,PowerBuilder应根据SQL Server返回的结果作出相应的‘提交Commit)’或‘回退(Rollback)’操作或者提示,这时可能会出现几种情形:

     1当SQL Server因出错而自动Rollback后,PowerBuilder如何了解错误且立即告知用户Update失败;

     2当SQL Server对Transaction处理结束且返回结果时,PowerBuilder要判断其结果是否符合要求,并进行相应的Commit或Rollback操作或者提示;

     3若某一客户端的系统发生故障或其使用者操作失误 时,PowerBuilder程序员如何处理SQL Server的数据锁或Transaction Log满的问题。

     在以上PowerBuilder处理数据的过程中,它的AutoCommit属性值的设定是很关键的,因此我们先介绍AutoCommit。

     那么如何正确使用AutoCommit属性:
     SQL Server是通过Begin Tran语句来控制同一个批次的Transaction中的数个SQL Statement及其处理的数据,通过Commit Tran和Rollback Tran语句来保证它们被全部处理成功后才提交、或者当该组中任一个或多个处理失败时被全部回退并释放被独占的所有数据,这就不会破坏数据处理的安全与完整性,SQL Server中的Begin Tran语句在PowerBuilder中对应的是AutoCommit属性,当AutoCommit的值为True时,SQL Server会在PowerBuilder执行任何一个SQL命令(例如:Update()或Embedded SQL等)后立即控制当前的事务处理并且自动进行Commit 或Rollback,这样就不能通过在PowerBuilder中用Commit或Rollback语句来进行控制,但是当AutoCommit为False时,PowerBuilder会先持送Begin Tran到SQL Server来独占被更新的数据,最后通过PowerBuilder中的Commit或Rollback语句来提交或回退并释放被独占的数据。

     研究了以上内容后我检查了代码,发现以前别人开发的AutoCommit设为了false最后加了commit,而我开发的却没有。以后做二次开发可要注意了,如果站点过多效率可就大大降低,甚至都瘫痪了。

 

转载自:http://blog.sina.com.cn/s/blog_9ed7673101010upt.html