Qlock()

阅读(975) 标签: qvs, 全局锁,

描述:

通过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)

 

判断是否加锁成功,成功则执行B3B4B5格,否则执行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)

 

判断是否加锁成功,成功则执行B3B4格,否则执行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.splxp2.splxp3.splx脚本时:

假设p1先被执行,那么将先创建名为lock1的全局锁,然后开始执行p1中对txt数据文件取数查询的操作,这个过程中,如果p2也开始执行,这时如果p1还未执行完即未解锁状态,那么p2执行Qlock时会开始等待,等待10秒后:如果p1仍旧未执行完,则p2放弃执行,直接返回获取锁失败;如果p1执行完毕,则p2开始执行加锁、重命名文件操作,并且返回“文件重命名成功”;

假设p2执行过程中p3也开始执行,由于p3中并没有对锁lock1进行判断,所以会直接执行删除txt操作,此时就会发生p2p3同时修改txt文件的冲突。