NC开发中时间戳的意义

来源:互联网 发布:麦克风软件 编辑:程序博客网 时间:2024/05/21 07:50

想必在开发的时候,尽管元数据制作时候没有ts字段,但是在单据模板初始化过程中会发现,候选框里有这个字段属性。

 

so,ts是个什么东西??

 

ts-----> time stamp时间戳,可以理解为时间节点

 

那么回归文题,ts的意义是什么??

 

我想举一个开发中的例子来解释一下这个问题

 

首先,我们要明确一点,那就是在单据模板初始化的过程中,ts这个字段是不可编辑的,换句话说,这个字段里的值不是你手动去输入的。

 

我们在新增表单数据的时候,insert语句里ts这个字段的值由于不是从表单里获得的,而是在后台代码里从系统时间里获得,也就是说在单据模板初始化的环节,有没有设置ts,新增操作都会将当前系统时间添加到数据库中。

 

OK,新增结束了,那么我们现在开始修改操作。

 

正确情况也就是在模板初始化里设置ts的情况下,修改操作时产生的修改表单(也就是后台代码里的参数,暂称为表单A。注意表单A不是修改后表单,二者区别是ts不同,修改后表单的ts会有更新)其ts字段有值。而错误操作也就是模板初始化未设置ts情况下表单A的ts为空。在修改操作过程中,有一步校验操作,检查的是表单A的ts和数据库里的ts是不是相同,当且仅当相同时才会进行后续操作,反之会报“当且表单正在被修改,请刷新”这样的错误提示。

 

那么,为什么表单A和修改后表单有这样的区别呢?是因为在修改界面点击保存按钮(也就是修改操作)时,会根据模板初始化里设置的字段进行数据库查询(select a,b,c,… from table),错误操作下,查询条件里没有ts这个字段,因而在表单A的生成过程中,ts即为空。

 

最后就要说一下为什么要有ts这个字段的存在。这就设计到数据库里的并发操作读写锁的概念。我们知道当进行数据库写操作的时候,需要先进行写锁以达到并发数据的唯一性。回到我们的表单,如果不进行ts校验,那么相当于未进行写锁保护,数据会发生紊乱。正确情况下我们设置ts字段,在新增数据时其ts值为data1,而后甲进行修改操作,甲的表单A里的ts值为data01,在甲修改的同时(也就是没有提交保存按钮这段时间),乙开始了修改操作,此时由于甲未提交,所以乙的表单A里的ts值扔为data01。而后甲点击了保存按钮,数据库里的ts更新成了data02。这个时候当乙修改完毕点击保存按钮的时候,由于ts值在之前被甲修改成了data02,乙申请修改操作时候从数据库拿的是data01,二者不匹配,报错。通过这个机制就防止了两个用户同时对一份表单进行修改,相当于上文说的数据库的写锁。

 

总结一句,时间戳的意义就是一个写锁的存在,用来控制并发。

 

0 0