数据保存(二) - 条件保存,乐观锁,联合主键,数据库增量,后端计算


1.保存的条件执行

如果希望保存某一组数据的时候,当某种条件满足的时候,不执行保存。那么可以使用这个功能。

  • save.onlyUpdate:如果是更新,执行。如果是插入,不执行。
  • save.onlyInsert:如果是插入操作,执行。如果是更新,不执行。
    例如,希望 it 在新增的时候才保存,可以在任意一个格子里,保存至表达式里写 save.onlyInsert(it)
    如果希望 it 记录在符合某种条件则不保存,条件自己来写。那么可以把条件的公式写在一个格子里,
    ,然后在格子的 保存至 属性里写 save.abandon(it),那么如果这个格子计算结果是 true,那么保存会放弃执行。

特别是对于多行的数据集来说,判断会是分开进行的,所以通过save.abandon可以实现有的记录保存,有的记录不保存。


2.乐观锁

例如库存,会员余额等数据,为了避免写丢失。也就是第一个人取出数据10,加3后写回去,13。而在他写回之前,第二个人取出数据还是10(因为第一给人还没写回),加5后写回去,15。最后+3的操作被覆盖掉了。

除了依靠乐观锁之外(数据表中增加了数值型的字段 mis_optimistic_version,系统会用这个字段进行乐观锁的判断,避免写丢失。)

设置了乐观锁的数据表,当有多人操作同一条记录的时候,后提交者会得到提示,您提交的数据已经被修改过,请重新刷新获取最新数据,然后提交。


3.数据表设计联合主键

除乐观锁之外可以通过数据库增量来实现多人同时操作某条记录而不发生写丢失。
但首先我们需要给库存表设置联合主键(商品,仓库),这两个字段唯一决定一条库存记录。
保存的时候,一般是根据id查找的记录,但如果保存的数据中,没有id字段,而有联合主键的字段就可以根据这一个或者多个字段联合起来查找需要修改的记录,如果没有就新增。


4.数据库增量

例如在保存 入库单(it)的时候,能同时给库存表,查找出对应的商品, 扣除 入库单的入库数量 (it.入库数量)。

数据保存(二) - 条件保存,乐观锁,联合主键,数据库增量,后端计算_第1张图片
设置联合主键

页面上建立数据, it_库存的 库存记录,初值可以是空的,仅仅用来表示保存至。
然后在 入库单的新增页面里,设置保存至属性。
it.商品it.商品 | it_库存.商品。it.仓库it.仓库 | it_库存.仓库。
it.入库数量:```it.入库数量 | save.dbIncrement(it_库存.数量):表示同时把这个数值作为增量存储到库存表的对应记录的数量里(对应记录,一般是根据id查找的记录,但这里没有id,而是由联合主键的字段商品和仓库共同决定)。

这样在插入一条库存记录的同时,库存对应商品和仓库的记录的数量会增加。


5.联动保存

上面的数据库增量配置,还可以配置在数据表视图中,在任何页面中执行插入一条入库单记录的时候都会生效。

数据保存(二) - 条件保存,乐观锁,联合主键,数据库增量,后端计算_第2张图片
联动保存配置
  • 影响表: 库存
  • 条件:table.库存.商品==it.商品 && table.库存.仓库==it.仓库。根据it(入库单)的商品和仓库字段去查找库存的记录。
  • 影响字段:商品 it.商品 表示库存表的商品字段的值是 it.商品。后面的仓库,最后入库时间同理。
  • 影响字段:数量 增量 it.入库数量 表示库存表的数量字段的值是增加 it.入库数量的值。 (如果是出库单,这里应该是 -it.出库数量)

如果库存表里还有一个字段总价值,是当前库存的这些商品的总价,那么影响字段可以增加:
总价值:增加 it.入库数量* table.商品.findOne(table.商品.id==it.商品).单价

你可能感兴趣的:(数据保存(二) - 条件保存,乐观锁,联合主键,数据库增量,后端计算)