描述:
通过QVS实现全局锁。
语法:
Qlock(n,s)
备注:
脚本中执行Qlock时,会在主控QVS上创建名称为n的锁,执行Qlock@u时解锁。
执行脚本代码前添加了对锁n的判断,则必须是已解锁的状态才能执行脚本;如果没有判断锁n,则不受锁n的影响,此时如果多个脚本文件同时操作同一个文件,会出现更新文件冲突。
未配置主控QVS时,将被解析成lock()函数。
参数:
n |
锁名称。 |
s |
加锁超时时间,单位为秒 。 |
选项:
@u |
解锁。 |
返回值:
Boolean值
示例:
创建脚本文件p1.splx,保存后上传至远程存储:
|
A |
B |
|
1 |
=Qlock("lock1") |
|
实现全局锁,锁名称为lock1 。 |
2 |
if(A1) |
|
判断是否加锁成功,成功则执行B3、B4、B5格,否则执行B7格。 |
3 |
|
=Qfile("qtc01/Employees.txt") |
获取远程存储中的Employees.txt文件。 |
4 |
|
=B3.import@t() |
读取B3文件中的数据。 |
5 |
|
return B4 |
返回B4的结果。 |
6 |
else |
|
|
7 |
|
return "获取锁失败" |
|
8 |
=Qlock@u("lock1") |
|
解锁。 |
创建脚本文件p2.splx,保存后上传至远程存储的qtc01存储桶中:
|
A |
B |
|
1 |
=Qlock("lock1",10) |
|
实现全局锁,锁名称为lock1,超过10秒未成功则加锁失败。 |
2 |
if(A1) |
|
判断是否加锁成功,成功则执行B3、B4格,否则执行B6格。 |
3 |
|
=Qmove("qtc01/Employees.txt","emp_new.txt") |
对远程存储中的Employees.txt文件重命名为emp_new.txt。 |
4 |
|
return "文件重命名成功!" |
返回结果。 |
5 |
else |
|
|
6 |
|
return "获取锁失败" |
|
7 |
=Qlock@u("lock1") |
|
解锁。 |
创建脚本文件p3.splx,保存后上传至远程存储:
|
A |
|
1 |
=Qmove("qtc01/Employees.txt ") |
删除远程存储中的Employees.txt文件。 |
当同时执行p1.splx、p2.splx、p3.splx脚本时:
假设p1先被执行,那么将先创建名为lock1的全局锁,然后开始执行p1中对txt数据文件取数查询的操作,这个过程中,如果p2也开始执行,这时如果p1还未执行完即未解锁状态,那么p2执行Qlock时会开始等待,等待10秒后:如果p1仍旧未执行完,则p2放弃执行,直接返回“获取锁失败”;如果p1执行完毕,则p2开始执行加锁、重命名文件操作,并且返回“文件重命名成功”;
假设p2执行过程中p3也开始执行,由于p3中并没有对锁lock1进行判断,所以会直接执行删除txt操作,此时就会发生p2、p3同时修改txt文件的冲突。