📄 lock.txt
字号:
数据窗口是PB最重要的技术之一,通过它,可以很方便的对数据库的数据进行增、删、改。刚刚学习PB的人,有没有考虑过,通常一个数据窗口是由Select语句构建的,它可以检索数据,我们很容易理解,可删除数据、修改数据也是靠寥寥几行代码就可以实现,这是如何实现的呢?
其实,这全是依靠数据窗口的“Update Properties”,对数据的删除、修改控制全在这里,见下图。
上面是一个数据窗口的Update Properties窗口,它记录了如下信息:
1:数据是否只读(Allow Updates)
如果把该选项关闭,那么在程序中的任何删、改操作都无法生效。
2:哪些列参与本次删、改操作(Where Clause for Update/Delete)
Key Columns:主键列
Key and Updateable Columns:主键列以及用户设置的允许修改的列(窗口左下部设置哪些列允许被修改),这是通常使用最广泛的方式。
Key and Modified Columns:主键列以及真正发生变化的列(如果一张表有200个字段,仅仅一、两个字段变化了,千万不能用这种方式)。
3:如何完全本次删、改操作(Key Modification)
Use Delete then Insert:如果是修改数据,先把该键值的数据删除除,再插入进来,再提交数据。用户感觉上数据仅仅是被修改过了。
Use Update:通过Update语句修改数据。
这样,我们就知道了数据窗口的工作原理。
如果删除数据,它找到主键列,然后用delete 语句删除相应数据;
如果是修改数据,它仍然找主键列,然后根据用户的设置判断是先删再插,还是直接修改,若是直接修改则再根据用户的设置对相应的列进行修改,这样,有时在程序里明明对n多列修改了数值,如果在此处设置不正确,也会得到不正确的结果。
其实,如果是单机版程序,数据库在本地,怎么设置都无大碍,但如果是C/S模式,每个属性就要与并发性以及数据库的“锁”有关系了。
先说说锁:锁是关系型数据库为保持一致性的一种策略,主要为共享锁和排它锁两种,即一批数据在一定时间段内被某个线程锁定。如果其它线程也要读这批数据,遇到的是共享锁,大家相安无事;如果其它线程要修改这批数据,遇到的就是排它锁,只是先等在一边凉快一会了。
排它锁的设置直接影响到数据库的性能,最恶心的是表锁,即A线程哪怕只读取某个存储了10000条记录的表中的1条数据,整个表也会给锁上,后面的线程得排队等会;通常用的是页锁,页锁锁定整个物理磁盘页面(大小为用户设置,不同DB不一样)以及该页面上所包含的所有行或记录;行锁就是锁定1条记录,大家各锁各的,只要不冲突就相安无事。关于锁的介绍,有兴趣可以去网上搜索一下。
锁理解清楚了,并发性也就明白一多半了。设想有10台计算机运行相同的程序,后面的数据库支持锁。有的计算机要修改数据了,是先删再插,还是直接修改呢,这两种操作的最终结果都会和锁打交道,如果操作的数据已经被锁定了,就需要等待,直到锁被释放。
无论何种语言,在进行RDMS项目的开发时,都应该在设计上尽量避免数据在相同的时间允许被不同的线程所操纵,否则会带来严重的运行效率问题。
背景知识:
DataWindow 在更新数据时,会根据用户对 DataWindow
中的数据进行的各种操作自动地转换成 SQL 语句,然后再执行。
例如:用户删除了一条记录(也就是脚本执行了 DeleteRow() 函数),
然后保存数据(调用 Update() 函数)。此时 Update 函数会将
刚才使用 DeleteRow()
删除的行自动转换成 SQL 语句。
正文:
几乎所有的数据库软件需要考虑并发控制问题。那么 PB 的
DataWindow 如何实现并发控制。答案就在 DataWindow 的更新属性
(Update Properties)中。打开 DataWindow 画笔中的 Rows->Update
Proerties 窗口。“Where Clause for
Update/Delete”组合框中的三个选项就是三种处理数据并发问题的策略。
首先做一个假设:
有两个用户,用户A与用户B。他们分别在两台计算机面前。他们两人
都通过 PB 的 DataWindow 访问一个表。用户A在用户B读数据之前已经
读取了表中的数据。
表中各子段名假设如下:
Column PR_C 主码
Column C1
Column C2
Column C3
Column C4
然后开始讨论他们的数据并发控制问题。
选项“Key Columns”:
该选项的意思是 DataWindow 生成的 SQL 语句的 Where 子句部分
只包含主码。也就是说 DataWindow 自动生成的SQL 语句大概样式是:
Update
Set C2 = XXXX,
Set C1 = XXXX
...
Where PR_C=OLD_PK
那么这意味着什么呢?试想一下如果用户A要更改PR_C=XXXX的
记录时,如果用户刚好将此条记录的PR_C字段内容改变了。
那么,很明显上述的 Update
语句也就无法执行。从而起到了控制并发操作。然而这种并发操作
发生的可能性非常小。因该说这样的并发控制完全没有意义。所以,
通常只有在开发单机版软件时才选择它。这么做的唯一好处就是减
少了 DataWindow 的运算量。
选项“Key and Updateable Column”:
改选项的意思是 DataWindow 生成的 SQL 语句的 Where 子句
部分包含主码与所有可以更新的字段。注意可更新字段与已更新字
段的区别。可更新字段指的是 DataWindow 允许更新的列(可以在
Rows->Update Proerties
中设置),那些不允许更新的列,即使数据被用户更改了,DataWindow
也不会为这些更改生成 SQL 语句。因此,用户的更改不会保存到数据库中。
已更新字段指的是被用户更改了的字段(在此文中同时也被认为是可
更新的列)。不妨假设列 C1、C2、C3为可更新列。所以此时
DataWindow 生成的 SQL 语句大概样式是:
Update
Set C1=xxx,
Set C2=xxx
,,,
Where PR_C = Old_PK
C1 = Old_value1 and
C2 = Old_value2 and
C3 = Old_Value3
其中 old_pk 指的是这条记录的原来 PK_C 字段上的值,
old_value1 表示 c1 字段上原来的值。由此可见如果此时用户B修改了
该记录的任何一个可更新字段,那么这条 Where 语句必定返回 false,
因此也无法更新?
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -