PB中datawindow更新屬性 如何控制數據庫並發
来源:互联网 发布:网络大学文凭有用吗 编辑:程序博客网 时间:2024/06/06 02:53
一、引言
对于Client/Server方式下的编程,不可避免地有并发操作处理的问题。为了说明问题,举一个不够恰当的例子:如果有两个用户A和B都试图访问同一员工记录并同时要求修改该员工工资时,会有什么情况发生呢?假设该员工的工资为1000元,两台机器修改记录之前读出用户工资均正确。A用户为此员工加本月奖金200元,查询到原来薪水为1000,加上200后变为1200,而此时B用户在不同的机器上扣除此员工的水电费50元,系统将salary字段置为950,显然这种修改是不能接受的,实际的结果应该是1150元。
DataWindow是PowerBuilder中一个独特的对象,功能强大,是Sybase的专利技术,它可以方便而快速地处理数据。通过数据窗口,我们无需编写复杂的SQL语句,就可以实现对数据库的读写操作。
实际上DataWindow 在更新数据时,会根据用户对 DataWindow 中的数据进行的各种操作自动地转换成 SQL 语句,然后再执行。例如:用户新增了一条记录,也就是脚本执行了InsertRow() 函数,输入数据后保存(调用 Update() 函数),此时 PB会将其自动转换成 SQL 语句,发送到数据库服务器。对于转换后的SQL语句,我们可以在datawindow的sqlpreview事件中,加脚本:
MessageBox('SQL语句',sqlsyntax)
来查看。
这里有一点需要注意,如果数据库连接的binding参数设定为enable,则sqlsyntax返回将不完整,插入一条记录时sqlsyntax呈如下形式:
INSERT INTO "personnel" ( "id", "name", "birthday", "technical_post", "salary", "notes" ) VALUES ( ?, ?, ?, ?, ?, ? )
为了正确返回sqlsyntax,需将binding参数设为disabled, 设置方法是在dbprofile对话框中,将transaction标签页的Disable Bind选项勾上,或者是在personnel.ini文件中DbParm改为:
DbParm=Connectstring='DSN=database_server',DisableBind=1
则sqlsyntax完整返回如下:
INSERT INTO "personnel" ( "id", "name", "birthday", "technical_post", "salary", "notes" ) VALUES ( 100, '令狐冲', '1975-05-01', '工程师', 1000, '软件开发' )
三、PowerBuilder中的并发控制
PowerBuilder中可以通过数据窗口的更新属性(Update Properties)来实现并发控制。打开 DataWindow 画笔板,点击 Rows->Update Properties菜单,进入“Specify Updatae Properties”对话框,其中“Where Clause for Update/Delete”组合框中的三个选项就是三种处理数据并发问题的策略。
1、选项“Key Columns”:
这种情况是比较更新前后Table的关键字是否发生了变化,即当前数据库中关键字的实际值和最初查询的值做比较,如果没有改变,则可以更新,反之不能更新。
如用户A将员工号为100的职员的salary字段值改为1200并保存后,B用户也将员工号为100的职员的salary字段值改为950并点击“存盘”按钮,我们可以看到数据窗口sqlpreview事件中的sqlsyntax返回如:
UPDATE "personnel" SET "salary" = 950 WHERE "id" = 100
因为关键字id=100没有发生变化,Where条件成立,更新成功,将A用户的修改覆盖,salary值变为950元,员工损失了200元。显然这样没有达到并发控制的目的,未能保证数据的完整性。
2、选项“Key and Updateable Column”:
这种情况是比较更新前后Table的关键字和可修改(更新)的列值是否发生了变化,如果没有一项发生改变,更新成功;反之,若数据库中当前值中若任一项与数据窗口最初检索出的值不一致,则更新失败。对于此例,因所有字段都是可修改(更新)的,即检测是否有任一字段变化。
同上,当用户A更新完后,B用户点击“存盘”按钮,我们可以看到sqlsyntax返回如:
UPDATE "personnel" SET "salary" = 950 WHERE "id" = 100 AND "name" = '令狐冲' AND "birthday" = '1975-05-01' AND "technical_post" = '工程师' AND "salary" = 1000 AND "notes" = '软件开发'
显然,id字段没有改变,而可修改(更新)列之一salary的值经A用户修改存盘后,已由1000变为了当前的1200,where条件不成立,因此更新失败,并弹出出错信息如下:
Row changed between retrieve and update.
No changes made to database.
UPDATE "personnel" SET "salary" = 950 WHERE "id" = 100 AND "name" = '令狐冲' AND "birthday" = '1975-05-01' AND "technical_post" = '工程师' AND "salary" = 1000 AND "notes" = '软件开发'
- PB中datawindow更新屬性 如何控制數據庫並發
- 在PB中如何控制DATAWINDOW列的修改属性
- 在PB中如何控制DATAWINDOW列的修改属性
- 在PB中如何控制DATAWINDOW列的修改属性
- 在PB中如何控制DATAWINDOW列的修改属性
- 在PB中如何控制DATAWINDOW列的修改属性
- 在PB中如何控制DATAWINDOW列的修改属性
- pb datawindow 控制消息
- 如何在PB中实现透明DATAWINDOW?
- 如何在PB中实现透明DATAWINDOW?
- 在PB中如何控制DATAWINDOW列的修改属性[转贴]
- PB如何在Datawindow(数据窗口)中控制列的修改方式
- [资料]在PB中如何控制DATAWINDOW列的修改属性
- 在PB中如何控制DATAWINDOW列的修改属性 -- 方法较全
- PB中datawindow常用技巧
- PB中datawindow常用技巧
- PB中用DataWindow.Update更新数据。
- PB中用DataWindow.Update更新数据。
- 软件工厂 架构以及元数据(software architecture and metadata)
- C#来创建和读取XML文档
- 總結的sql常用經典查詢
- 常用正则表达式收集
- 经典sql短小语句
- PB中datawindow更新屬性 如何控制數據庫並發
- 网络游戏性能测试的几点想法
- C#可访问性级别
- Validation服务器控件:RequiredFieldValidator
- XFire构建服务端Service的两种方式
- 汽车的十大实用功能与十大忽悠配置
- 苹果CEO乔布斯在斯坦福大学的演讲稿
- 聚簇索引和非聚簇索引
- 让你知道codepage的重要,关于多语言编码