S4中的新的MM数据模型以及HANA的Insert-only特性允许物料凭证的并行处理,提高了相关的吞吐量。由此,数据库锁的应用情况也发生了变化。下文将介绍这些变化(基于S4 1610)。

本文链接:http://www.cnblogs.com/hhelibeb/p/9059153.html

英文原文:Lock strategies in S/4HANA 1610

Key figure模型和Account模型

在SAP S/4 HANA, on-premise edition 1610中,物料估价不再需要排它锁(exclusive locking),这包含所有价格控制为“移动平均价”的和所有特殊库存类型的物料,因为HANA是一个Insert-only数据库,因此它允许物料凭证的并行处理。

因为在S/4HANA OP1610和CE1608中,新的MM-IM数据模型将旧的key figure模型变为了account模型(53个帮助快速计算/统计的额外列),这允许更细粒度的延迟数量锁定。

下面就是Key figure模型和Account模型的例子,

Key figure模型:

Account模型

对于Key figure模型模型而言,必须在物料和工厂级别上加锁。但是通过Account模型,可以在物料、工厂、存储位置、存储标识、特殊存储标识级别加锁(原则上可以在新模型中任何定义了库存的级别上加锁)。因此,即便是在过去很可能发生锁碰撞的情况下,现在也能并行处理了。

移动平均价的锁

当货物移动改变了库存价值(SALK3)和已估计库存(LBKUM)的时候,移动平均价必须据此调整,这会产生一个V1级别的更新,并且在更新结束前一直需要一个排它锁。数量/价值的变化主要来源于货物移动带来的外部值(比如,来自于采购订单)。然而,如果变化的来源仅仅是舍入差异,移动平均价将不会再调整。

创建批次时的锁(分割评估)

如果创建了物料主数据或者由一个货物移动带来改变时,还是需要排它锁的。如果使用了分割评估,且必须创建新的批次的话,货物移动会创建物料主数据。

对不允许负库存的工厂的延迟共享锁

S/4 HANA OP1610和CE1608引入了一个新的增加吞吐量的选项。这个选项可以在配置中设定,对延迟锁策略(late lock strategy),不允许再使用排它锁,而是使用延迟共享锁(late shared locks),这使得物料凭证的并行处理成为了真正的现实。

库存检查在这种情况下依然是可行的,因为所有的处理进程都会把他们的提取发送到锁服务器,此时,锁服务器将成为库存变更的第二存储(第一存储是数据库),数据的计算会从第一和第二存储进行。

批次主数据变更时的锁

从S/4 HANA OP1610和CE1608开始,为了物料凭证过账时的碰撞率,对于批次物料行项目而言,批次锁只会在批次主数据变更时存在,例如生产日期或best before date变更、且与数据库中现有值不同时

对On-the-fly calculations的优化

由于on-the-fly calculation,聚合数量变化会存储到混合和聚合表中,成为实际库存数据。这使得对这些表的读访问要比Suite on HANA慢。

为了将on-the-fly calculation的劣势转变为优势,S/4 HANA OP1610和CE1608会引入以下特性:

  • 在预读取阶段,只有物料主数据会被读取到内部缓存中,这是通过纯物料主数据视图来从数据库中检索数据的。
  • 行项目处理中库存数量会从数据库的Account模型中读取,并且这只会在库存减少、且禁止负库存的情况下才会进行。

因此,对于S/4 HANA OP1610和CE1608而言,为延迟锁策略的进行的调整允许物料凭证处理的平行处理,而从数据库读取库存数量的策略和库存检查的策略减少了单个物料凭证的处理时间。总之,相较于过去的S/4 HANA OP1511和Suite on HANA,新版本的系统减少了物料凭证的处理时间。

允许负库存的工厂的锁策略

  1. 在延迟锁策略下,不再加任何锁。
  2. 不会再从数据库进行库存判断,也不会再进行库存检查(在两种锁策略下都是)。

S/4 HANA中的数据库锁策略的更多相关文章

  1. 6.翻译系列:EF 6 Code-First中数据库初始化策略(EF 6 Code-First系列)

    原文链接:http://www.entityframeworktutorial.net/code-first/database-initialization-strategy-in-code-firs ...

  2. EF CodeFirst 数据库初始化策略

    最近用EF做了几个小东西,了解简单使用后有了深入研究的兴趣,所以想系统的研究一下EF CodeFist的几个要点.下面简单列一下目录 1.1 目录 数据库初始化策略和数据迁移Migration的简单介 ...

  3. EF CodeFirst系列(9)---添加初始化数据和数据库迁移策略

    1.添加初始化数据(Seed) 我们可以在初始化数据库的过程中给数据库添加一些数据.为了实现初始化数据(seed data)我们必须创建一个自定义的数据库初始化器(DB initializer),并重 ...

  4. web开发中的两把锁之数据库锁:(高并发--乐观锁、悲观锁)

    这篇文章讲了 1.同步异步概念(消去很多疑惑),同步就是一件事一件事的做:sychronized就是保证线程一个一个的执行. 2.我们需要明白,锁机制有两个层面,一种是代码层次上的,如Java中的同步 ...

  5. 聊一聊 MySQL 数据库中的那些锁

    在软件开发中,程序在高并发的情况下,为了保证一致性或者说安全性,我们通常都会通过加锁的方式来解决,在 MySQL 数据库中同样有这样的问题,一方面为了最大程度的利用数据库的并发访问,另一方面又需要保证 ...

  6. java和数据库中所有的锁都在这了

    1.java中的锁 1.1 锁的种类 公平锁/非公平锁 可重入锁/不可重入 独享锁/共享锁 读写锁 分段锁 偏向锁/轻量级锁/重量级锁 自旋锁 1.2 锁详细介绍 1.2.1 公平锁,非公平锁 公平锁 ...

  7. MySQL:聊一聊数据库中的那些锁

    在软件开发中,程序在高并发的情况下,为了保证一致性或者说安全性,我们通常都会通过加锁的方式来解决,在 MySQL 数据库中同样有这样的问题,一方面为了最大程度的利用数据库的并发访问,另一方面又需要保证 ...

  8. SQLSERVER2008中创建数据库发生无法获得数据库'model'上的排他锁

    SQLSERVER2005中创建数据库发生无法获得数据库'model'上的排他锁是怎么回事? 创建数据库失败,提示无法获得数据库‘model’上的排他锁,如下图所示: 解决方法: 在查询分析器中运行如 ...

  9. 一例胜千言,详谈SQL Sever数据库锁

    1 前言 数据库大并发操作要考虑死锁和锁的性能问题.看到网上大多语焉不详(尤其更新锁),所以这里做个简明解释,为下面描述方便,这里用T1代表一个数据库执行请求,T2代表另一个请求,也可以理解为T1为一 ...

随机推荐

  1. android 开发Handler源码剖析

    Android的消息机制主要是Handler的运行机制,而讲Handler的机制,又需要和MessageQueue和Looper结合.MessageQueue中文意思是消息队列,虽说叫队列,但是其内部 ...

  2. 【Matlab编程】matlab 画图

    1.  不用截图工具就可以将图保存成图像格式,并且没有背景颜色:saveas(gcf ,'outputname','png/jpg'),第三项省略时默认为fig.m文件 2.  计算形如(-1)^2/ ...

  3. Linux性能监测:监测目的与工具

    Linux性能监测:监测目的与工具介绍 系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不是说现在优化了,测试了 ...

  4. JSP 知识基本

    from:http://blog.csdn.net/caipeichao2/article/details/38589293 more:http://www.2cto.com/kf/web/jsp/4 ...

  5. javascript显式类型转换

    尽管js可以做许多自动类型转换,但某些时候仍然需要做显示类型转换或为了代码逻辑清晰易读而做显示类型转换. 做显示类型转换最简单的方法就是用Boolean().Number().String()或Obj ...

  6. ruby轻松自删除代码

    因为windows的文件删除机制和unix like的不一样,so不保证如下代码能在windows中使用,哪位童鞋帮我在windows中测试一下也好啊! #!/usr/bin/ruby 5.times ...

  7. 《转》优化UITableViewCell高度计算的那些事

    我是前言 这篇文章是我和我们团队最近对 UITableViewCell 利用 AutoLayout 自动高度计算和 UITableView 滑动优化的一个总结.我们也在维护一个开源的扩展,UITabl ...

  8. ValueObject的理解

    思考ValueObject应该更多从内存的角度思考,而非DB持久化的角度. 例如: public class A { public int Id { get; set; } public Addres ...

  9. linux上安装redis的踩坑过程

    redis用处很广泛,我不再啰嗦了,我按照网上教程想在linux上安装下,开始了踩坑过程,网上买了一个linux centos7.3,滴滴云的,巨坑无比啊,不建议大家用这家的! redis 为4.0, ...

  10. JavaScript中两个对象数组 属性undefined

    var BaiduUsers = []; var UserArray = function(name, phone, id, id2) { this.name = name; this.phone = ...