Pb的并发控制

来源:互联网 发布:中国十大游戏公司 知乎 编辑:程序博客网 时间:2024/06/16 20:03

       PowerBuilder中可以通过数据窗口的更新属性(Update Properties)来实现并发控制。


 并发控制主要通过 where Clause for Update/Delete 的三个选项来控制:

(1)选项“Key Columns”:

      这种情况是比较更新前后Table的关键字是否发生了变化,即当前数据库中关键字的实际值和最初查询的值做比较,如果没有改变,则可以更新,反之不能更新。
      这是最宽泛的并发控制,可以说基本是不控制,所有信息项允许随便改,会出现更新丢失的问题:
      例如操作员A和操作员B同时打开了一条记录,A先修改了信息项A,保存,然后B又修改了信息项A,保存,这样,A修改的信息将丢失。
      该选项一般在没有并发的一些功能中使用,例如编码维护呀之类的。

(2)选项“Key and Updateable Column”;

        这种情况是并发控制最严的情况,把所有允许修改的信息项都增加在where的条件中,如果发现一个字段与更新前不符,将并弹出出错信息如下:
        Row changed between retrieve and update.
        No changes made to database.

        这种模式下,保证了并发的安全性,同时也限制了一些本应该允许的并发,可以根据情况来选择使用。该选项是DW默认的更新模式。
        举例说明:

        操作员A和操作员B同时打开了一条记录,A先修改了信息项A,保存,然后B又修改了信息项B,保存,这样,操作员A的数据被保存,操作员B的更改将失败;
        操作员A和操作员B同时打开了一条记录,A先修改了信息项A,保存,然后B又修改了信息项A,保存,这样,操作员A的保存会被保存,操作员B的保存同样会失败。

(3)选项“Key and Modified Columns”;

        这种是并发控制较合适的模式,只把发生变化的信息项,加到where的条件判断中。既防止了更新丢失又允许了一定的并发。
        举例说明:

        操作员A和操作员B同时打开了一条记录,A先修改了信息项A,保存,然后B又修改了信息项B,保存,这样,操作员A和操作员B的更改都会保存;
        操作员A和操作员B同时打开了一条记录,A先修改了信息项A,保存,然后B又修改了信息项A,保存,这样,操作员A的保存会被保存,操作员B的保存不会被保存。

       这种模式可以广泛的使用。

(4)使用SQL语句的情况

        如果是使用SQL语句的话,就要使用pb的事务处理,这样就能确保你的修改是完整,而且不被别人干扰。

        举例说明:将表table_test的dbid=1的记录的num1字段的值更改为2000
sqlca.autocommit=false //一定要设置为不自动提交 string ls_errdec lc_new = 2000 dec lc_old select num1 into :lc_old from table_test where dbid=1; //如果有必要查询当前值的话. if sqlca.sqlcode <0 then   ls_err=sqlca.sqlerrtext //先读错误信息,然后立即ROLLBACK再提示,以免提示时用户不确定,表还在锁定中   rollback; //立即回滚,以免其它用户等待.   messagebox("提示","数据库发生以下错误:~n"+ls_err)   return end ifupdate num1=:lc_new from table_test where dbid=1 and num1=:lc_old; if sqlca.sqlcode <0 then   ls_err=sqlca.sqlerrtext //先读错误信息,然后立即ROLLBACK再提示,以免提示时用户不确定,表还在锁定中   rollback; //立即回滚,以免其它用户等待.   messagebox("提示","更新数据时发生以下错误:~n"+ls_err)   return end ifcommit using sqlca;

这样就可以了,你在更新时,事务会锁定其它的操作. 

结论:

 
从上文我们可以得出如下结论:
 
(1)“Key Columns”选项在控制数据完整性方面最弱,它所允许的并发操作是最多的,所禁止的并发操作发生的可能性非常小,只有当主键被更改后才起并发控制作用,当一条记录的关键字改变了才进行控制,这显然没有多大意义。实际上这种方法一般只在单机版的应用程序中使用,而在Client/Server模式中是很少使用的。
(2)“Key and Updateable Columns”的是PB的默认选项,控制最为严格,可以实现最安全的并发控制,充分保证数据的完整性,但它也会禁止我们做一些本当允许的并发修改(如上面所说的第二例),是并发能力最差的方法。
(3)“Key and Modified Columns”选项可以说是前两者的折衷,在控制数据完整性和严格性方面比第一项强,比第二项弱,在允许的并发操作数量方面比第一项少,比第二项多。
(4)如果使用Sql,我们可以借鉴pb的DW控制机制,使用事务,并且把修改的项目加到where子句中,控制并发。 

至于在程序中选取哪一种控制比较合适,我们应该根据应用的具体情况来选择。


0 0
原创粉丝点击