北京集团网站建设,什么网站做视频,小程序有哪些开发平台,网站续费怎么做分录企业级软件或开发框架#xff0c;必然支持后台高并发#xff0c;即支持多人同时访问数据库。SAP作为资深企业管理软件#xff0c;自然也不例外#xff0c;ABAP可以很方便的开发出支持高并发的程序#xff0c;要实现高并发#xff0c;正确使用锁对象是其中一个重要环节必然支持后台高并发即支持多人同时访问数据库。SAP作为资深企业管理软件自然也不例外ABAP可以很方便的开发出支持高并发的程序要实现高并发正确使用锁对象是其中一个重要环节今天我们就一起来看看SAP的锁对象。SAP锁对象属于数据字典的一部分它并不是数据库锁而是存在于队列应用服务器内存中是一种逻辑锁假设现在AB两个用户要同时修改一张表中的记录为了保证数据一致性程序先为A用户加锁加锁成功后A用户可以正常修改表。这时B用户也要修改此表程序同样尝试为B用户加锁但发现表已经被锁定那么加锁失败程序需要提示B用户表已被锁定。只有当A用户修改完毕将锁释放B用户才可以正常修改表。SAP锁有多种模式常用的有E, S, X, O这几种。下面分别做简要说明模式E当更改数据的时候设置为此模式。 模式S本身不需要更改数据但是希望显示的数据不被别人更改。模式X和E类似但是不允许累加完全独占。 模式O乐观锁多个用户可以重复加乐观锁但当有新的用户加了排它锁E或者已有用户的乐观锁提升为排它锁时所有的乐观锁将失效。除了上述几种模式还要理解锁的拥有者即owner一般来说SAP锁要么属于dialog会话进程要么属于update进程。程序运行是从dialog会话进程开始的当调用call function...in update task时会进入update 进程这个时候update进程会继承锁对象。这两种拥有者的区别在于如果拥有者是update进程那么执行commit work后锁会自动消失。理解了锁的模式和拥有者我们来看看在系统中如何创建和使用锁对象。步骤1事务码SE11选择所对象输入EZ_ZTDEPEMP。注意所对象要求必须E 开头。步骤2选择锁模式常用模式上面有介绍过一般选择E。步骤3输入锁参数默认是表的关键字。输入参数后可以指定锁定那些记录如果参数为空则锁定整张表。保存激活后锁对象就创建成功了。那么如何使用这个锁对象呢SAP锁对象在创建的时候会额外自动创建两个函数ENQUEUE_EZ_XXXXX 和 DEQUEUE_EZ_XXXXX。具体到我们刚才创建的锁对象函数分别是ENQUEUE_EZ_ZTDEPEMP 和 DEQUEUE_EZ_ZTDEPEMP用于加锁和解锁。在程序中调用这两个函数然后可以通过事务码SM12观察加锁和解锁的情况。一起来看一段锁产生冲突的代码CALL FUNCTION ENQUEUE_EZ_ZTDEPEMPEXPORTINGmode_ztdepemp   Emandt           sy-mandt
*   DEPNO           001
*   EMPNO           000001
*   X_DEPNO          
*   X_EMPNO          _scope          1
*   _WAIT            
*   _COLLECT         EXCEPTIONSforeign_lock    1system_failure  2OTHERS          3.
IF sy-subrc  0.
* Implement suitable error handling here
ENDIF.打开两个窗口运行这段程序第一个窗口运行程序后通过事务码SM12查看锁对象可以看到表ZTDEPEMP加锁成功了第二个窗口再次运行程序会发现没有产生新的锁对象通过debug发现sy-subrc  1说明表再次加锁和现有的锁冲突了不应该继续更改表。上面的程序有两个重要参数mode_ztdepemp  E这个参数就是之前提到的锁模式。E表示更新排它锁。一个用户加E类型锁后其它用户就不能继续加锁。_scope  1这个参数用来指定锁的拥有者owner。_scope  1时锁的拥有者是dialog会话。_scope  2时当出现CALL FUNCTION XXX IN UPDATE TASK 时update会话就会继承这个锁这样在commit work时锁就会自动释放掉。我们将上面的代码稍作修改_scope  2。再通过debug 和SM12观察锁对象可以验证上面的锁机制。CALL FUNCTION ENQUEUE_EZ_ZTDEPEMPEXPORTINGmode_ztdepemp   Emandt           sy-mandt
*   DEPNO           001
*   EMPNO           000001
*   X_DEPNO          
*   X_EMPNO          _scope          2
*   _WAIT            
*   _COLLECT         EXCEPTIONSforeign_lock    1system_failure  2OTHERS          3.
IF sy-subrc  0.
* Implement suitable error handling here
ENDIF.CALL FUNCTION ZFM_UPDATE_DEPEMP IN UPDATE TASK.COMMIT WORK.最后我们来看看乐观锁的使用。假设现在有两个屏幕都要修改同一张表如果使用排它锁E那么只有一个屏幕可以在修改模式下查看数据。如果我们需要多个屏幕都以修改模式来查看那可以使用乐观锁O。当数据需要保存时再将乐观锁升级为排它锁。升级的同时其它的乐观锁都会自动消除。如何使用乐观锁和升级成排它锁可以参考下面代码。CALL FUNCTION DEQUEUE_EZ_ZTDEPEMPEXPORTINGmode_ztdepemp  Omandt          sy-mandt
*   DEPNO          001
*   EMPNO          000001
*   X_DEPNO         
*   X_EMPNO         
*   _SCOPE         3
*   _SYNCHRON       
*   _COLLECT        .CALL FUNCTION ENQUEUE_EZ_ZTDEPEMPEXPORTINGmode_ztdepemp   Rmandt           sy-mandt
*   DEPNO           001
*   EMPNO           000001
*   X_DEPNO          
*   X_EMPNO          _scope          1
*   _WAIT            
*   _COLLECT         EXCEPTIONSforeign_lock    1system_failure  2OTHERS          3.
IF sy-subrc  0.
* Implement suitable error handling here
ENDIF.先将mode_ztdepemp  O 设置为O即为乐观锁再将mode_ztdepemp  R 设置为R升级为排它锁。SAP锁对象就介绍到这里了希望大家能不断积累经验写出更加健壮的程序。如有问题可加入群讨论。微信号eckwise