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" = ‘软件开发‘
此时点击《刷新》按钮,我们可以看到,salary的值仍为1200,达到了并发控制的目的,保证数据的完整性。
3、选项“Key and Modified Columns”:
这种情况是比较更新前后Table的关键字和要修改(更新)的列值是否发生了变化,如果没有改变,更新成功,反之更新失败。对于本例,即判断关键字id和将要修改字段salary是否发生变化。
同上,当用户A更新完后,B用户点击“存盘”按钮,我们可以看到sqlsyntax返回如:
UPDATE "personnel" SET "salary" = 950 WHERE "id" = 100 AND "salary" = 1000
这里id字段没有改变,而此次将要修改的列salary值已由1000变为了1200,where条件不成立,因此更新失败,并弹出出错信息如下:
Row changed between retrieve and update.
No changes made to database.
UPDATE "personnel" SET "salary" = 950 WHERE "id" = 100 AND "salary" = 1000
此时我们点击《刷新》按钮,我们可以看到,salary的值仍为1200,也达到了并发控制的目的。
再举一个例子:
如果A用户更新的是备注notes字段,而B用户更新的是薪水salary字段,按照业务,这种操作是允许的,而在PB中会如何处理呢?
1、对于选项“Key Columns”: 因为关键字没有改变,更新成功。
2、对于选项“Key and Updateable Column”:
当用户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字段也没有改变,但可修改(更新)列之一notes的值经A用户的修改,已由“软件开发”变为了“硬件维护”,where条件不成立,因此更新失败,系统将报出错信息。
此时点击《刷新》按钮,可以看到,salary的值仍为1200,notes的值为“硬件维护”。
3、对于选项“Key and Modified Columns”:
当用户A更新完后,B用户点击“存盘”按钮,我们可以看到sqlsyntax返回如:
UPDATE "personnel" SET "salary" = 950 WHERE "id" = 100 AND "salary" = 1000
这里,id字段没有改变,而将要修改的列salary值也没有改变(A用户只是修改了notes字段),where条件成立,,因此更新成功。